リレーションを持つ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つの理由
-
のために働いていません
- ユーザーにはテーブルの作成権限がないため、一時テーブルを作成できません。 (そのデータを取得する別の方法はありますか)。
- groupid 105のグループは、トリガーが(saモードで)機能しているため、そのアイテムをその関係に追加する前に削除を制限していると思います。
今のところ、両方のテーブルを削除し、正しいデータで再度入力します。私はDBでそれを解決したいと思います。
誰もが本物のテンポラリテーブル( '#'を前置したもの)を作成できます。 –
また、どのバージョンのSQL Server? –