2010-09-20 18 views
7

Esiste una query in SQL Server 2008 che eliminerà anche i dati da tutte le tabelle dipendenti, insieme alla tabella selezionata?Elimina dati dalle tabelle dipendenti

Le mie scuse per non aver elaborato la domanda. So che Cascade Delete funzionerebbe bene, ma la mia applicazione si collega a un db di SQL Server di terze parti. Ho alcuni test unitari che vengono inseriti nella tabella di destinazione e nelle tabelle dipendenti. Sfortunatamente i vincoli sulla tabella di destinazione non sono On Elimina Cascade e non posso crearli o averli creati. Sto cercando un modo generico di attraversare le dipendenze e cancellare i dati nel giusto ordine.

+2

Se si dispone di vincoli di integrità (chiavi esterne) con regola di eliminazione a cascata, non ci si deve preoccupare. http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.sqls.doc/sqls292.htm – AlexanderMP

+1

Anche se il collegamento è per la documentazione di informix, lo stesso vale per SQL Server. – Giorgi

+0

se si hanno almeno chiavi esterne definite (senza eliminazioni a cascata), sarebbe possibile utilizzare le tabelle di sistema per creare un SQL dinamico e fare in effetti lo stesso effetto delle eliminazioni a catena. Se non ci sono chiavi esterne definite, c'è poca speranza di fare una soluzione generica per questo. –

risposta

7

Come ci sono relazioni di chiave esterna, seguente script potrebbe iniziare simulando una cascata eliminare.

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

Per fare che si imposta un vincolo tra i tavoli con cascata eliminare. È possibile farlo in un diagramma trascinando un collegamento tra i campi e la modifica delle proprietà, o utilizzando una query:

alter table SomeTable 
add constraint SomeConstraint 
foreign key (SomeField) references SomeOtherTable (SomeOtherField) 
on delete cascade 
Problemi correlati