删除Microsoft SQL的触发器

删除Microsoft SQL的触发器,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,我正在创建两个触发器。一个用于捕获奖励表的插入值,另一个用于捕获奖励表的删除值。触发器的主要功能是将所做的更改类型记录到审计表中 奖励表: 审计表: audit_insert_触发器的SQL为: CREATE TRIGGER tr_rewards_insert ON Rewards AFTER INSERT, UPDATE AS IF UPDATE(category) BEGIN DECLARE @category char(6) DECLARE @type_

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

奖励表:

审计表:

audit_insert_触发器的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
我的想法是只替换“插入”的位置,然后将“删除”。我真的不明白。关于为什么这样做行不通的逻辑以及2。如何将删除的值放入审核表并记录为删除


不能在一个触发器中触发。必须是两个独立的触发器

您的
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
触发器基本相同。切勿假定插入的
和删除的
只有一行。

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

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
触发器基本相同。永远不要假设插入的
和删除的
只有一行。

找到了答案:

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

找到了答案:

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

insert工作正常,并记录在审核表中。delete是不会记录到表中的触发器。对于影响多行的语句,两个触发器都将失败。“永远不要假设插入和删除的只有一行。”不要介意我的评论。我明白你现在在说什么了。它不会同时记录多个条目。还是SQL的新手!!insert工作正常,并记录在审核表中。delete是不会记录到表中的触发器。对于影响多行的语句,两个触发器都将失败。“永远不要假设插入和删除的只有一行。”不要介意我的评论。我明白你现在在说什么了。它不会同时记录多个条目。还是SQL的新手!!