2011-06-05 76 views
2

假設我有3個表幫助上的SQL Server觸發

T1

Nid name 
1 aaa 
2 bbb 
3 ccc 

delT1

Nid name 

T2

Sid Nid  value 
1  1  AAA 
2  1  BAC 
3  2  CSA 

在表t1Nid是主鍵,這是t2

現在我想的是,當我從t1刪除值,它會自動刪除從t2其中t1.Nid=t2.Nid和刪除t1值插入到了所有值外鍵delT1

我如何創建這種類型的任務的觸發?

請幫助我,因爲我是新來的sql

回答

2

修改FK在T2是ON DELETE CASCADE

ALTER TABLE T2 DROP CONSTRAINT FK_T1_Nid; <-- your constraint name here 
ALTER TABLE T2 ADD CONSTRAINT FK_T1_Nid FOREIGN KEY (Nid) 
    REFERENCES T1 (Nid) ON DELETE CASCADE; 

然後創建T1觸發器來將信息推送到delT1 :

CREATE TRIGGER TR_T1_D ON T1 FOR DELETE 
AS 
SET NOCOUNT ON; 
INSERT delT1 
SELECT Nid, Name 
FROM Deleted; 

請注意,此觸發器會阻止您在DELETE上針對T1使用OUTPUT子句。 BOL says

如果輸出子句同時沒有指定INTO關鍵字指定,DML操作的目標不能有它對於給定的DML動作定義的任何啓用觸發器。例如,如果在UPDATE語句中定義OUTPUT子句,則目標表不能有任何已啓用的UPDATE觸發器。

+0

對不起,我發佈的時候刪除的內容是滾動的! – gbn 2011-06-06 19:20:05

+0

@gbn是的,在右邊丟失文字是一個問題,尤其是在移動設備上。 – ErikE 2011-06-06 20:15:10

4

一個正常的觸發是行不通的:代碼運行前的外鍵會給出一個錯誤。

你可以做的是設置你的外鍵,以便在T1一個刪除CASCADE將從T2自動刪除。

就個人而言,我會使用一個存儲的過程和事務從T2到刪除第一,然後T1。

+1

良好的通話,我沒有想到通過海報實際上試圖完成和約束拋出一個錯誤 – RThomas 2011-06-05 17:18:54

+0

@ lazyDBA:是的,很容易被遺忘。而且你知道,我不記得,如果一個前/ INSTEAD OF觸發器會工作...;) – gbn 2011-06-05 17:21:23

2

@gbn有較佳的路要走。既然你問了一個觸發器,你可以爲比較起見做到這一點:

CREATE TRIGGER t1_Delete ON t1 
INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON; 
    INSERT INTO delT1 (Nid, name) 
    SELECT Nid, name 
    FROM DELETED; 

    DELETE FROM t2 
    WHERE t2.Nid IN (SELECT Nid FROM DELETED); 

    DELETE FROM t1 
    WHERE t1.Nid IN (SELECT Nid FROM DELETED); 
END; 
+0

你忘了加上'INSERT INTO delT1 ...' – 2011-06-05 18:09:37

+0

@Andriy米 - 是的,我確實這樣做了 - 謝謝。編輯包含delT1表。 – Yuck 2011-06-05 19:59:12