7
votes

Supprimer des données des tables dépendantes

Y a-t-il une requête dans SQL Server 2008 qui supprimera également des 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 Delete Cascade fonctionnerait bien, mais ma candidature se connecte à une 3ème partie SQL Server DB. 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 Suppr Cascade et je ne peux pas les créer ou les avoir créés. Je cherche une manière générique de traverser les dépendances et la suppression de données dans le bon ordre.


5 commentaires

Si vous aviez des contraintes d'intégrité (clés étrangères) avec la règle de la suppression en cascade, vous n'auriez pas à vous inquiéter. Publib.Boulder.ibm. Com / InfoCenter / IDSHELP / V10 / Sujet / ...


Même si le lien est pour Informix, la documentation est la même chose pour SQL Server.


Si vous avez au moins des clés étrangères définies (sans supprimation en cascade), il serait possible d'utiliser les tables système pour créer une SQL dynamique et en effet, de la sorte que les suppressions en cascade. S'il n'y a pas de clés étrangères définies, il y a peu d'espoir de faire une solution générique pour cela.


@Lieven, oui il existe des relations clés étrangères avec les tables dépendantes. Pourriez-vous s'il vous plaît élaborer sur votre suggestion?


Voir Stackoverflow.com/Questtions/485581/...


3 Réponses :


1
votes

Lire environ sur cascade Supprimer de MSDN, des livres, des articles et vous trouverez la réponse.

Contraintes d'intégrité référentielle en cascade < / p>


0 commentaires

2
votes

Pour faire cela, vous configurez une contrainte entre les tables avec une suppression en cascade. Vous pouvez le faire dans un diagramme en faisant glisser une connexion entre champs et en modifiant les propriétés, ou à l'aide d'une requête: xxx


0 commentaires

7
votes

Comme là-bas strong> sont forts> Relations de clé étrangère, le script suivant peut vous aider à imiter une suppression en cascade.

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


0 commentaires