SQL Server: Drop Table с FK

В таблице "A" зависит от 30 других таблиц через FK до "A.Id".

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

Не удалось удалить объект 'dbo.A' потому что на него ссылается ИНОСТРАННЫЙ Ограничение KEY

Вопрос (ы):

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

Ответ 1

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

Ответ 2

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

Ответ 3

В Management Studio вы можете щелкнуть правой кнопкой мыши по таблице и script CREATE и DROP, которые будут включать все внешние ключи.


Чтобы быть более конкретным, это даст вам все ограничения, от которых зависит ваш стол. Однако он не дает вам список внешних ключей, которые зависят от этой таблицы. Таким образом, помимо скриптов, которые вы создадите, щелкнув правой кнопкой мыши по таблице в SMS, вам нужно найти и script все внешние ключи. Чтобы получить их список, вы можете запустить такой запрос:

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'

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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