SQL Server: удаление таблицы с FK - PullRequest
11 голосов
/ 09 марта 2010

От таблицы «A» зависит около 30 других таблиц через FK до «A.Id».

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

Не удалось удалить объект 'dbo.A' потому что на него ссылается иностранный КЛЮЧЕВОЕ ограничение

Вопрос (ы):

  • Как я могу удалить и воссоздать таблицу "A" ?
  • (или) есть ли способ отключить зависимости схемы глобально?
  • (или) есть ли способ сделать резервную копию (всех!) Зависимостей перед удалением и восстановлением таблицы "A" и впоследствии восстановить все зависимости?

Ответы [ 6 ]

5 голосов
/ 09 марта 2010

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

4 голосов
/ 09 марта 2010

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

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

3 голосов
/ 09 марта 2010

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

2 голосов
/ 09 марта 2010

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

2 голосов
/ 09 марта 2010

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

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

0 голосов
/ 09 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...