Удалить данные из зависимых таблиц - PullRequest
7 голосов
/ 20 сентября 2010

Есть ли в SQL Server 2008 запрос, который также удалит данные из всех зависимых таблиц вместе с выбранной таблицей?

Приношу извинения за то, что не уточнил этот вопрос.Я знаю, что Cascade Delete будет работать нормально, но мое приложение подключается к сторонней базе данных SQL Server.У меня есть несколько модульных тестов, которые вставляются в целевую таблицу и зависимые таблицы.К сожалению, ограничения для целевой таблицы не касаются «Удалить каскад», и я не могу их создать или создать.Я ищу общий способ обхода зависимостей и удаления данных в правильном порядке.

Ответы [ 3 ]

7 голосов
/ 21 сентября 2010

Поскольку являются отношениями внешнего ключа, следующий скрипт может помочь вам начать имитировать каскадное удаление.

DECLARE @TableName VARCHAR(32)
DECLARE @PrimaryKey VARCHAR(32)

SET @TableName = 'MasterTable'
SET @PrimaryKey = '1'

SELECT  'DELETE FROM '
        + fks.name + '.' + fkt.name
        + ' WHERE '
        + pc.name 
        + ' = '
        + @PrimaryKey
        , fko.name as [FK Name]
        , fk.constraint_column_id as [Col Order]
        , fks.name + '.' + fkt.name as [FK table]
        , pc.name as [FK column]
        , rcs.name + '.' + rct.name as [PK table]
        , rc.name as [PK column]
FROM    sys.foreign_key_columns fk
        -- FK columns
        INNER JOIN sys.columns pc ON fk.parent_object_id = pc.object_id
                                     AND fk.parent_column_id = pc.column_id
        INNER JOIN sys.objects fkt ON pc.object_id = fkt.object_id
        INNER JOIN sys.schemas as fks ON fks.schema_id = fkt.schema_id
        -- referenced PK columns
        INNER JOIN sys.columns rc ON fk.referenced_object_id = rc.object_id
                                     AND fk.referenced_column_id = rc.column_id
        INNER JOIN sys.objects rct ON rc.object_id = rct.object_id
        INNER JOIN sys.schemas as rcs ON rcs.schema_id = rct.schema_id
        -- foreign key constraint name
        INNER JOIN sys.objects fko ON fk.constraint_object_id = fko.object_id
WHERE   rct.Name = @TableName
2 голосов
/ 20 сентября 2010

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

 alter table SomeTable
 add constraint SomeConstraint
 foreign key (SomeField) references SomeOtherTable (SomeOtherField) 
 on delete cascade
1 голос
/ 20 сентября 2010

Прочитайте о ON CASCADE DELETE из MSDN, книг, статей, и вы найдете ответ.

Каскадные ограничения ссылочной целостности

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