【问题标题】:SQL After Delete Trigger has Null values in the Deleted Pseudotable?删除触发器后的 SQL 在已删除伪表中有 Null 值?
【发布时间】:2014-12-09 09:19:22
【问题描述】:

我在尝试删除记录时尝试使此触发器工作。它的工作方式是,当有人试图删除一条记录时,它会回滚并将审计记录插入到 TbAudit 表中,顺便说一下,所有列都有一个 NOT NULL 约束。然而,事实证明它不会这样做,因为由于某种原因我不明白当我尝试删除记录时它会显示消息并回滚但是我在 select 语句中的所有变量都得到 NULL 值,即使我直接从“删除”表。请帮忙。

USE BdPlan
GO
CREATE TRIGGER TrAudit
   ON  Plan.TPlan
   AFTER DELETE
AS 
BEGIN
DECLARE @IdPlan = int,
        @IdEmployee int,
        @Month int,
        @Year int

ROLLBACK
PRINT 'CANT DELETE RECORDS'

-- All variables are getting NULL

SELECT  @IdPlan = D.IdPlan,            
        @IdEmployee = D.IdEmployee ,   
        @Month = D.Month,              
        @Year = D.Year                 

FROM    deleted AS D

INSERT INTO BdAudit.dbo.TbAudit
           VALUES
               (
               @IdPlan,
               @IdEmployee,
               @Month,
               @Year,
               SUSER_NAME(),
               GETDATE()
               )
END

【问题讨论】:

    标签: sql triggers sql-server-2012


    【解决方案1】:

    我认为这种方法可能存在问题:

    • 您正试图在事务回滚后访问 DELETED 伪表 - 回滚后它将有零行(见下文)
    • 您的触发器仅尝试处理单行删除 - 它应该能够处理多行删除

    还需要注意的是,在ROLLBACK 之前从 Deleted 伪表直接插入到 Audit 表中当然也会回滚审计数据。

    From here 显然您可以将要审计的数据缓存在@Temporary 表变量中,然后执行ROLLBACK(不会撤消@Temp 表),然后执行审计插入:

    ALTER trigger d_foo ON FOO AFTER DELETE
    AS BEGIN
        DECLARE @Temp AS TABLE
        (
            ID INT, 
            -- Obviously add all your fields go here
        );
    
        INSERT INTO @Temp(ID)
            SELECT ID FROM DELETED;
    
        ROLLBACK TRAN;
    
        insert into fooaudit(id)
            select id from @Temp;
    END;
    

    Simplified SqlFiddle here 删除多行。

    为了确认,DELETED 伪表在触发器中的 ROLLBACK 之后包含零行,如 modified Fiddle demonstrates

    【讨论】:

    • 在触发器中使用 ROLLBACK 时要小心。如果你的外部代码有一个显式事务,你会得到一个异常,因为没有事务可以回滚或提交。我更喜欢使用 RAISERROR,以便调用应用程序知道发生了什么事情,并且您不会收到不匹配的事务。
    猜你喜欢
    • 2020-09-30
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多