2017-03-19 3 views
0

Salut J'ai une simple table A et B,MSSQL Cascade Supprimer deux colonnes avec FK à une table

Table A 
int Id NOT NULL 

Table B 
int Id NOT NULL 
int A1 NULL (FK to Table A.Id) 
int A2 NULL (FK to Table A.Id) 

Ce que je voudrais faire est de supprimer dossier du tableau B lorsque l'enregistrement lié (sur A1, A2 ou les deux) a été supprimé.

J'ai créé sur Cascade d'action SUPPRIMER sur la relation A1 et il fonctionne parfaitement, mais quand je suis en train de mettre en place sur l'action Cascade SUPPRIMER sur A2 relation que je suis:

« A » table enregistrée avec succès Table 'B' - Impossible de créer la relation 'FK_B_A2'. L'introduction de la contrainte FOREIGN KEY 'FK_B_A2' sur la table 'B' peut provoquer des cycles ou des chemins multiples en cascade . Indiquez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY. Impossible de créer une contrainte ou un index. Voir les erreurs précédentes.

Je ne comprends pas pourquoi cela ne peut pas être configuré? Je veux simplement pouvoir utiliser SQL MERGE sur la table A (et quand quelque chose est supprimé, je veux supprimer les enregistrements liés dans la table B ou la fusion échoue).

+0

Quelle est relation entre les tables? Les colonnes du tableau B 'A1' et' A2' sont liées à la colonne Table A 'Id'? –

+0

Oui, je vais mettre à jour mon message, les colonnes A1 et A2 ont FK à la table A – Teamol

Répondre

2

vous pouvez résoudre ce problème en

1) Set Cascade sur Supprimer A1

2) au lieu de définir Cascade sur Supprimer A2 Création Trigger comme ceci:

CREATE TRIGGER [DELETE_B] 
    ON dbo.[A] 
    INSTEAD OF DELETE 
AS 
BEGIN 
SET NOCOUNT ON; 
DELETE FROM [B] WHERE A2 IN (SELECT Id FROM DELETED) 
DELETE FROM [A] WHERE Id IN (SELECT Id FROM DELETED) 
END