2011-09-22 14 views
0

リレーションを持つ2つのテーブルがあります。テーブル1はgroupidでグループを保持しています。表2は2つのグループ間の関係を保持しています。SQL複数のテーブルから削除するトリガー

table 1 
GroupId, Name, Description, ....... 

table 2 
MasterGroupId, SubGroupId, sequenceNumber 

表1からグループの削除を実行する場合、すべての関連グループを削除する必要があります。

これには、グループの下のサブグループとそのサブグループが再帰的に含まれます。両方のテーブル内のデータの

例は、前後の削除データの

表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 

表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 

例を削除 表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 

delete文

delete from tbl_TemplateListGroup where GroupId = 104 

トリガーは今です:

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                

このことは2つの理由

    のために働いていません
  1. ユーザーにはテーブルの作成権限がないため、一時テーブルを作成できません。 (そのデータを取得する別の方法はありますか)。
  2. groupid 105のグループは、トリガーが(saモードで)機能しているため、そのアイテムをその関係に追加する前に削除を制限していると思います。

今のところ、両方のテーブルを削除し、正しいデータで再度入力します。私はDBでそれを解決したいと思います。

+0

誰もが本物のテンポラリテーブル( '#'を前置したもの)を作成できます。 –

+0

また、どのバージョンのSQL Server? –

答えて

0

残念ながら、2つのテーブルが含まれているため、一時テーブルが必要です。以下のような何か:

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) 

これは、サブグループのテーブルの上に閉鎖を計算するためにRecursive Common Table Expressionを使用しています。これらはSQL Server 2005以降で利用できます。

関連する問題