8

您好可以在触发器主体上的 DML 命令/操作(插入、删除、更新)之间切换吗?我尝试摘录一些 T-SQL 以更好地理解我:

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

谢谢,

4

5 回答 5

21

我将向您展示一种在 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
    BEGIN
        -- logic for insert
    END

    IF @i > 0 AND @d > 0
    BEGIN
        -- logic for update
    END

    IF @i = 0 AND @d > 0
    BEGIN
        -- logic for delete
    END
END

请注意,由于 SQL Server 2008 中引入的复杂性,这可能不是完全向前兼容的MERGE。有关更多信息,请参阅此连接项:

因此,如果您计划MERGE在未来使用 SQL Server 2008,那么这更有理由将触发器拆分为每种类型的 DML 操作的触发器。

(如果您想避免更多理由MERGE请阅读此。)

于 2009-11-17T21:12:58.580 回答
7

您可以使用inserteddeleted查看对表进行了哪些更改。

对于 UPDATE,deleted表包含行的旧版本和inserted新版本。

如您所料,DELETE 和 INSERT 使用它们自己的表。

于 2009-11-17T21:16:06.717 回答
6

您可以拥有三个单独的触发器,一个用于 INSERT,一个用于 UPDATE,一个用于 DELETE。由于每个触发器都不同,因此不需要切换逻辑。

于 2009-11-17T21:05:48.540 回答
2

我认为执行此操作的一般方法是为每个操作创建一个触发器,如下所示:

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
于 2009-11-17T21:15:36.093 回答
0

您可以使用 union join 对所有命令/操作使用一个触发器;

CREATE TRIGGER DML_ON_TABLEA
 ON  TABLEA
AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
   --logic for insert
    insert into Backup_table (columns_name) select columns_name from inserted i
    --logic for delete
   UNION ALL
    insert into Backup_table (columns_name) select columns_name from deleted d
END
GO

--note 更新命令,如插入的命令,但删除了另一个命令

于 2019-09-20T07:15:52.260 回答