На таблице "A" зависят приблизительно 30 других таблиц через FK к "A.Id".
Для интеграционного тестирования я должен отбросить таблицу и воссоздать его для создания определенного состояния. Из-за зависимого возражает их, казаться, не быть никаким способом удалить и воссоздать таблицу. Сообщение об ошибке:
Не мог отбросить объект 'dbo.' Потому что на это ссылается ограничение FOREIGN KEY
Вопрос (вопросы):
Перейдите к базе данных в SSMS и щелкните правой кнопкой мыши. Выбирайте задачи, генерируйте скрипты. Затем просмотрите параметры и установите их так, как вы хотите (возможно, чтобы выбрать только внешние ключи в таблице и создать зависимые объекты, а затем отбросить и воссоздать, не надо; есть варианты передо мной, но вы их увидите. Затем выберите таблицы, которые вы хотите создать сценарии для FK и записать их в файл. Откройте файл и разделите операторы drop в один файл, а параметры создания - в другой. Теперь у вас есть tweo файлы, которые вы можете запускать автоматически делать то, что вы хотите, когда бы вы ни запускали run тест. Я бы посоветовал воссоздать файлы перед запуском первого теста (в случае, если они изменились с момента последнего запуска тестов), но не для каждого отдельного теста.
Разверните таблицу в Sql Server Management Studio, разверните папку ограничений.
Запишите все имеющиеся у вас ограничения, чтобы вы могли их воссоздать. Удалите ограничения и отбросьте таблицу. Восстановите таблицу и заново создайте свои ограничения.
Изучите системную таблицу sys.foreign_key_columns
. Вот пример, который у меня завалялся, который, задав таблицу, скажет вам, какие из ее столбцов связаны ключом с другой таблицей:
DECLARE @tableName VARCHAR(255)
SET @tableName = 'YourTableName'
SELECT OBJECT_NAME(fkc.constraint_object_id) AS 'FKName', OBJECT_NAME(fkc.[referenced_object_id]) AS 'FKTable', c2.[name] AS 'FKTableColumn', @tableName AS 'Table', c1.[name] AS 'TableColumn'
FROM sys.foreign_key_columns as fkc
JOIN sys.columns AS c1 ON c1.[object_id] = fkc.[parent_object_id] AND c1.[column_id] = fkc.[parent_column_id]
JOIN sys.columns AS c2 ON c2.[object_id] = fkc.[referenced_object_id] AND c2.[column_id] = fkc.[referenced_column_id]
WHERE fkc.[parent_object_id] = OBJECT_ID(@tableName)
ORDER BY OBJECT_NAME(fkc.constraint_object_id)
С помощью этого или какого-то другого варианта вы можете узнать внешние ключи, удалить их, сделать свои дела, а затем снова создать внешние ключи.
Я должен добавить, что я знаю, что это работает на SQL2005 и SQL2008. Я не знаю, будет ли это работать на SQL2000/MSDE.
Возможно, подумайте о сохранении виртуальный сервер с вашей базой данных в его начальной тестовой настройке. Загрузите виртуальную машину, выполните тестирование, n выбросьте измененную ВМ.
В Management Studio вы можете щелкнуть правой кнопкой мыши по таблице и создать сценарии CREATE и DROP, которые будут включать все внешние ключи.
Чтобы быть более конкретным, это даст вам все ограничения, от которых зависит ваша таблица. Однако он не дает вам список внешних ключей, которые зависят от этой таблицы. Таким образом, помимо сценариев, которые вы создадите, щелкнув правой кнопкой мыши по таблице в SMS, вам необходимо найти и создать сценарии для всех внешних ключей. Чтобы получить их список, вы можете выполнить такой запрос:
select FKConstraint.TABLE_NAME, FKConstraint.CONSTRAINT_NAME
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As UniqueConstraint
On UniqueConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FKConstraint
On FKConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME
Where UniqueConstraint.TABLE_NAME = 'TableA'
Для каждого из них вам нужно будет создать сценарий создания и удаления. Вы добавляете капли в верхнюю часть своего скрипта перетаскивания, а создаёт в конце вашего скрипта создания.