2009-11-17 89 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按照您的预期使用自己的表。