Но я не получаю «предыдущих ошибок». Строка, которую он дает мне (двойным щелчком в SSMS), показывает второй оператор alter как виновник:
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_A_Audit_AuditTypeID]')
AND parent_object_id = OBJECT_ID(N'[dbo].[A_Audit]'))
ALTER TABLE [dbo].[A_Audit] WITH CHECK ADD CONSTRAINT [FK_A_Audit_AuditTypeID] FOREIGN KEY([AuditTypeID])
REFERENCES [dbo].[T_Type] ([TypeID])
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_A_Audit_AuditTypeID]')
AND parent_object_id = OBJECT_ID(N'[dbo].[A_Audit]'))
ALTER TABLE [dbo].[A_Audit] CHECK CONSTRAINT [FK_A_Audit_AuditTypeID]
GO
Теперь, когда я пытаюсь удалить этот фрагмент сценария, я получаю ту же самую ошибку в другом операторе ограничения изменения, указывающем на ту же таблицу (T_Type).
Тот же неизмененный сценарий отлично работает с нашей базой данных TEST, схема которой идеально подходит для нашей производственной базы данных. Это наводит меня на мысль, что есть некоторый внешний фактор, заставляющий этот скрипт работать в тестировании, но не в продакшене.
Мне удалось найти два основных различия между нашей производственной и тестовой машинами:
Любая помощь приветствуется.
Это было вызвано приложением, запущенным на чьей-то машине разработчика, у которого было соединение связанного сервера с нашей производственной базой данных. Это приложение блокировало выполнение оператора alter (почему-то я не спрашивал).
Спасибо, что посмотрели.
Я должен сначала спросить об этом, прежде чем углубляться в другие детали. Вы проверили, что в таблице dbo.A_Audit нет данных, которые нарушают ограничение внешнего ключа в таблице dbo.T_Type? Приведены ли какие-либо данные в производственной среде?
SELECT * FROM dbo.A_Audit A
WHERE NOT EXISTS ( SELECT * FROM dbo.T_Type T WHERE A.AuditTypeID = T.TypeID)