2010-09-20 6 views
7

Existe-t-il une requête dans SQL Server 2008 qui supprimera également les données de toutes les tables dépendantes, ainsi que la table sélectionnée? Mes excuses pour ne pas avoir élaboré sur la question. Je sais que Cascade Delete fonctionnerait bien, mais mon application se connecte à une base de données SQL Server tierce. J'ai quelques tests unitaires qui insèrent dans la table cible et les tables dépendantes. Malheureusement, les contraintes sur la table cible ne sont pas sur Supprimer Cascade et je ne peux pas les créer ou les créer. Je suis à la recherche d'une manière générique de traverser les dépendances et de supprimer les données dans le bon ordre.Supprimer des données des tables dépendantes

+2

Si vous aviez des contraintes d'intégrité (clés étrangères) avec une règle de suppression en cascade, vous ne devriez pas vous inquiéter. http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.sqls.doc/sqls292.htm – AlexanderMP

+1

Même si le lien concerne la documentation informix, il en va de même pour le serveur SQL. – Giorgi

+0

si vous avez au moins des clés étrangères définies (sans suppression en cascade), il serait possible d'utiliser les tables système pour créer un SQL dynamique et en fait faire la même chose que les suppressions en cascade. Si aucune clé étrangère n'est définie, il y a peu d'espoir de trouver une solution générique. –

Répondre

7

Comme il sont relations clés étrangères, script suivant pourrait vous aider à démarrer mimer une cascade supprimer.

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

Pour ce faire, vous définissez une contrainte entre les tables avec suppression en cascade. Vous pouvez le faire dans un diagramme en faisant glisser une connexion entre les champs et la modification des propriétés, ou en utilisant une requête:

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