2009-11-17 91 views
7

你好,可以DML之間切換命令/操作的觸發機構(插入,刪除,更新)?我嘗試片斷一些T-SQL更好的理解我:SQL Server觸發器開關插入,刪除,更新

CREATE TRIGGER DML_ON_TABLEA 
    ON TABLEA 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CASE 
    WHEN (INSERT) THEN 
     -- INSERT ON AUX TABLEB 
    WHEN (DELETE) THEN 
     -- DELETE ON AUX TABLEB 
    ELSE --OR WHEN (UPDATE) THEN 
     -- UPDATE ON AUX TABLEB 
    END 
END 
GO 

感謝,

回答

18

我會告訴你一個簡單的方法來檢查這在SQL Server 2000或2005年(你忘了提及你使用的是哪個版本),但總的來說我同意Remus你應該把它們分解成單獨的觸發器:

DECLARE @i INT, @d INT; 
SELECT @i = COUNT(*) FROM inserted; 
SELECT @d = COUNT(*) FROM deleted; 
IF @i + @d > 0 
BEGIN 
    IF @i > 0 AND @d = 0 
     -- insert 
    IF @i > 0 AND @d > 0 
     -- update 
    IF @i = 0 AND @d > 0 
     -- delete 
END 

注意,這可能不是完全向前兼容由於複雜MERGE介紹SQL Server 2008中更多信息請參閱此連接項目:http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321930

因此,如果您打算使用SQL Server 2008和未來的MERGE,那麼這就更有理由將觸發器分解爲觸發器每種類型的DML操作。

+0

+1爲「更多理由將觸發器分開」。這真的節省了很多時間,並且只是「有意義的」 - 爲什麼還要花費所有的時間來弄清楚需要完成什麼工作,以及單獨的觸發器如何完成工作。謝謝@Aaron。 – 2016-08-01 21:38:34

6

你可以有三個獨立的觸發器,一個用於INSERT一個UPDATE一個DELETE。由於每個觸發器都不相同,因此不需要切換邏輯。

3

我認爲要做到這一點,一般的方法是創建一個觸發器,每一個動作,就像這樣:

CREATE TRIGGER INSERT_ON_TABLEA 
ON TABLEA 
AFTER INSERT 
AS 
BEGIN  
SET NOCOUNT ON;  
-- INSERT ON AUX TABLEB 
END 
GO 

CREATE TRIGGER DELETE_ON_TABLEA 
ON TABLEA 
AFTER DELETE 
AS 
BEGIN  
SET NOCOUNT ON;  
-- DELETE ON AUX TABLEB 
END 
GO 
7

您可以使用inserted and deleted tables看到表中所作的更改。

對於UPDATE,deleted表包含舊版本的行,並且inserted是新版本。

DELETE和INSERT按照您的預期使用自己的表。