SQL Server: таблица отбрасывания с FK

На таблице "A" зависят приблизительно 30 других таблиц через FK к "A.Id".

Для интеграционного тестирования я должен отбросить таблицу и воссоздать его для создания определенного состояния. Из-за зависимого возражает их, казаться, не быть никаким способом удалить и воссоздать таблицу. Сообщение об ошибке:

Не мог отбросить объект 'dbo.' Потому что на это ссылается ограничение FOREIGN KEY

Вопрос (вопросы):

  • Как я могу отбросить и воссоздать таблицу "A"?
  • (или) есть ли какой-либо путь, выключают зависимости от схемы глобально?
  • (или) есть ли любой способ скопировать (все!) зависимости прежде, чем удалить и восстановить таблицу "A" и восстановление все зависимости позже?
11
задан marc_s 9 March 2010 в 17:29
поделиться

6 ответов

Перейдите к базе данных в SSMS и щелкните правой кнопкой мыши. Выбирайте задачи, генерируйте скрипты. Затем просмотрите параметры и установите их так, как вы хотите (возможно, чтобы выбрать только внешние ключи в таблице и создать зависимые объекты, а затем отбросить и воссоздать, не надо; есть варианты передо мной, но вы их увидите. Затем выберите таблицы, которые вы хотите создать сценарии для FK и записать их в файл. Откройте файл и разделите операторы drop в один файл, а параметры создания - в другой. Теперь у вас есть tweo файлы, которые вы можете запускать автоматически делать то, что вы хотите, когда бы вы ни запускали run тест. Я бы посоветовал воссоздать файлы перед запуском первого теста (в случае, если они изменились с момента последнего запуска тестов), но не для каждого отдельного теста.

3
ответ дан 3 December 2019 в 07:37
поделиться

Использовать транзакцию. В конце теста - откатить.

2
ответ дан 3 December 2019 в 07:37
поделиться

Разверните таблицу в Sql Server Management Studio, разверните папку ограничений.

Запишите все имеющиеся у вас ограничения, чтобы вы могли их воссоздать. Удалите ограничения и отбросьте таблицу. Восстановите таблицу и заново создайте свои ограничения.

2
ответ дан 3 December 2019 в 07:37
поделиться

Изучите системную таблицу 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.

5
ответ дан 3 December 2019 в 07:37
поделиться

Возможно, подумайте о сохранении виртуальный сервер с вашей базой данных в его начальной тестовой настройке. Загрузите виртуальную машину, выполните тестирование, n выбросьте измененную ВМ.

0
ответ дан 3 December 2019 в 07:37
поделиться

В 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'

Для каждого из них вам нужно будет создать сценарий создания и удаления. Вы добавляете капли в верхнюю часть своего скрипта перетаскивания, а создаёт в конце вашего скрипта создания.

4
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: