2010-09-20 16 views
7

Czy istnieje zapytanie w programie SQL Server 2008, które usunie dane ze wszystkich tabel zależnych, a także z wybranej tabeli?Usuwanie danych z tabel zależnych

Moje przeprosiny za brak rozwinięcia w pytaniu. Wiem, że Cascade Delete działa dobrze, ale moja aplikacja łączy się z bazą danych SQL innego producenta. Mam kilka testów jednostkowych, które wstawiam do tabeli docelowej i tabel zależnych. Niestety ograniczenia na tabeli docelowej nie dotyczą opcji Usuń kaskadę i nie mogę ich utworzyć ani utworzyć. Szukam ogólnego sposobu przechodzenia przez zależności i usuwania danych we właściwej kolejności.

+2

Jeśli masz ograniczenia integralności (klucze obce) z regułą kasowania kaskadowego, nie musisz się martwić. http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.sqls.doc/sqls292.htm – AlexanderMP

+1

Mimo że łącze jest dla dokumentacji informix, to samo dotyczy serwera sql. – Giorgi

+0

Jeśli masz zdefiniowane przynajmniej klucze obce (bez usuwania kaskadowego), możliwe byłoby użycie tabel systemowych do utworzenia dynamicznego SQL i w efekcie robi to samo, co usuwanie kaskadowe. Jeśli nie zdefiniowano żadnych kluczy obcych, nie ma co liczyć na ogólne rozwiązanie tego problemu. –

Odpowiedz

7

Ponieważ relacji klucza obcego, po skrypt może Ci zacząć naśladowanie kaskadowego usunąć.

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

Aby to zrobić skonfigurować ograniczenie między stolikami z kaskadowych usunąć. Można to zrobić w diagramie przeciągając połączenia między polami i edycję właściwości, lub przy użyciu kwerendy:

alter table SomeTable 
add constraint SomeConstraint 
foreign key (SomeField) references SomeOtherTable (SomeOtherField) 
on delete cascade 
Powiązane problemy