【问题标题】:DELETE Trigger for Microsoft SQLMicrosoft SQL 的 DELETE 触发器
【发布时间】:2017-06-13 13:40:34
【问题描述】:

我正在创建两个触发器。一种用于捕获 Rewards 表的插入值,另一种用于捕获 Rewards 表的已删除值。触发器的主要功能是记录对审计表所做的更改类型。

奖励表: enter image description here

审核表: enter image description here

audit_insert_trigger 的 SQL 是:

CREATE TRIGGER tr_rewards_insert 
ON Rewards AFTER INSERT, UPDATE 
AS IF UPDATE(category)
    BEGIN
    DECLARE @category   char(6)
    DECLARE @type_change    char(20)

    SELECT @category = (SELECT category FROM inserted)  

    IF EXISTS (SELECT * FROM inserted)
        BEGIN 
            SELECT @type_change = 'Inserted'
        END 
    INSERT INTO audit_rewards
        VALUES (
        @category, USER_NAME(), GETDATE(), @type_change)
END 

CREATE TRIGGER tr_rewards_delete
ON Rewards AFTER UPDATE 
AS IF UPDATE(category)
BEGIN
DECLARE @category   char(6)
DECLARE @type_change    char(20)

SELECT @category = (SELECT category FROM deleted)   

IF EXISTS (SELECT * FROM deleted)
    BEGIN 
        SELECT @type_change = 'Deleted'
    END 

INSERT INTO audit_rewards
    VALUES (
    @category, USER_NAME(), GETDATE(), @type_change)
 END

我的想法是替换“插入”的位置并放置“删除”。我不是很明白 1. 为什么这不起作用的逻辑和 2. 如何将删除的值放入审计表并记录它是一个删除。

无法一次性完成。必须是两个独立的触发器。

【问题讨论】:

    标签: sql sql-server tsql triggers


    【解决方案1】:

    您的insert 触发器不正确。我认为应该是:

    CREATE TRIGGER tr_rewards_insert 
    ON Rewards AFTER INSERT, UPDATE 
    AS IF UPDATE(category)
    BEGIN
        INSERT INTO audit_rewards
            SELECT 'INSERTED, USER_NAME(), GETDATE(), category
            FROM inserted;
    END;
    

    DELETED 触发器基本上是相同的。永远不要假设 inserteddeleted 只有一行。

    【讨论】:

    • 插入工作正常并记录在审计表中。删除是不会记录到表的触发器。
    • 对于影响多行的语句,两个触发器都会失败。 “永远不要假设插入和删除只有一行。”
    • 别介意我的评论。我明白你现在在说什么。它不会一次记录多个条目。 SQL 还是新手!!
    【解决方案2】:

    想出了答案:

    CREATE TRIGGER tr_rewards_insert 
    ON Rewards AFTER INSERT, UPDATE 
        AS IF UPDATE(category)
        BEGIN
        DECLARE @category   char(2)
        DECLARE @type_change    char(20)
        SELECT @category = (SELECT category FROM inserted)  
        SELECT @type_change = 'Inserted'
    
        INSERT INTO audit_rewards
        VALUES (@category, USER_NAME(), GETDATE(), @type_change)
        END
    CREATE TRIGGER tr_rewards_delete
    ON Rewards AFTER DELETE, UPDATE 
        AS IF UPDATE(category)
        BEGIN
        DECLARE @category   char(2)
        DECLARE @type_change    char(20)
    
        SELECT @category = (SELECT category FROM deleted)   
        SELECT @type_change = 
    
        INSERT INTO audit_rewards
        VALUES (@category, USER_NAME(), GETDATE(), @type_change)
        END
    

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 2017-05-26
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多