2011-09-22 3 views
0

J'ai 2 tables avec relation entre. la première table contient des groupes avec groupid. le tableau 2 tient la relation entre les 2 groupes. Lors de la pré-suppression d'une suppression d'un groupe du tableau 1, tous les groupes associés doivent être supprimés.Suppression de trigger SQL à partir de plusieurs tables

cela inclut les sous-groupes du groupe et il y a des sous-groupes récursive.

exemple des données dans les deux tables avant de supprimer

Tableau Tbl_TemplateListGroup

GroupId |Name  |Description |TemplateListId 
100 | Group 1 | NULL | 6 
101 | Group 2 | NULL | 6 
102 | Group 11 | NULL | 6 
103 | Group 12 | NULL | 6 
104 | Group 13 | NULL | 6 
105 | Group 131 | NULL | 6 
106 | Group 1311 | NULL | 6 
107 | Group111 | NULL | 6 

Tableau Tbl_TemplateListGroupGroup

Master | Sub  SequenceNumber 
Group | Group 
Id  | Id 
100 | 102 | 1 
100 | 103 | 2 
100 | 104 | 3 
102 | 107 | 1 
104 | 105 | 1 
105 | 106 | 1 

exemple de suppression de données après Tableau Tbl_TemplateListGroup

GroupId |Name  |Description |TemplateListId 
100 |Group 1 |   |6 
101 |Group 2 |   |6 
102 |Group 11 | |6 
103 |Group 12 | |6 
107 |Group111 | |6 

Tabel Tbl_TemplateListGroupGroup

Master Sub  SequenceNumber 
Group Group 
Id  Id 
100 |102 |1 
100 |103 |2 
102 |107 |1 

la déclaration de suppression

delete from tbl_TemplateListGroup where GroupId = 104 

Le déclencheur est maintenant:

CREATE TRIGGER TR_TemplateListGroupDelGroup       
on Tbl_TemplateListGroup           
INSTEAD OF DELETE             
AS                 
    BEGIN                
    SET NOCOUNT ON;             

    BEGIN               
     SELECT GroupId INTO tmpTbl FROM Tbl_TemplateListGroup   
     WHERE GroupId in (SELECT SubGroupId FROM Tbl_TemplateListGroupGroup 
         WHERE MasterGroupId in (select d.GroupId from deleted d)) 

     DELETE FROM Tbl_TemplateListGroupGroup      
     WHERE SubGroupId in (select d.GroupId from deleted d)  

     DELETE FROM Tbl_TemplateListGroupGroup      
     WHERE MasterGroupId in (select d.GroupId from deleted d) 

     DELETE FROM Tbl_TemplateListGroup        
     WHERE GroupId in (select d.GroupId from deleted d)   

     DELETE FROM Tbl_TemplateListGroup        
     WHERE GroupId in (select GroupId FROM tmpTbl)     

     DROP TABLE tmpTbl;           
    END                
    END                

cela ne fonctionne pas pour 2 raisons

  1. L'utilisateur n'a aucun droit de création de table et ne peut donc pas créer de table temporaire. (existe-t-il un autre moyen d'obtenir ces données).
  2. Je pense que le groupe avec groupId 105 est limite la supprimer parce que le déclencheur travaillait (en mode sa) avant d'avoir ajouté cet élément avec sa relation.

Pour l'instant je supprime les deux tables et les remplis à nouveau avec les données correctes. Je voudrais résoudre cela dans la base de données.

+0

Tout le monde peut créer de véritables tables temporaires (celles préfixées par '#'). –

+0

En outre, quelle version de SQL Server? –

Répondre

0

Malheureusement, étant donné que deux tables sont concernées, une table temporaire sera toujours requise. Quelque chose comme:

CREATE TABLE #GroupIDs (ID int) 

;WITH Closure AS (
    SELECT GroupId from deleted 
    UNION ALL 
    SELECT SubGroupId from Tbl_TemplateListGroupGroup lgg inner join Closure c on lgg.MasterGroupId = c.GroupId 
) 
INSERT INTO #GroupIDs (ID) SELECT GroupID from Closure 

DELETE FROM Tbl_TemplateListGroupGroup where MasterGroupID in (select ID from #GroupIDs) 
DELETE FROM Tbl_TemplateListGroup where GroupID in (select ID from #GroupsIDs) 

Il utilise un Recursive Common Table Expression pour calculer la fermeture sur la table du sous-groupe. Ceux-ci sont disponibles à partir de SQL Server 2005.

Questions connexes