日志触发器(更新前)- SQL Server

Posted

技术标签:

【中文标题】日志触发器(更新前)- SQL Server【英文标题】:Log Trigger (BEFORE UPDATE) - SQL Server 【发布时间】:2014-09-26 14:36:14 【问题描述】:

我有一张桌子:

TABLE1

cod   |           date
 1    |  2008-07-03 00:00:00.000
 2    |  2009-09-03 00:00:00.000
 5    |  2010-12-03 00:00:00.000

我有一个触发器:

CREATE TRIGGER trigger1
ON TABLE1
INSTEAD OF UPDATE
AS
    DECLARE
        @cod   numeric(9)
       ,@date  datetime

    DECLARE c_test cursor for select cod, data from TABLE1

    open c_test 
    fetch next from c_test into @cod, @date

    WHILE @@FETCH_STATUS = 0 
        BEGIN

           IF(@date < GETDATE())
           BEGIN
                INSERT INTO TABLE_AUDIT (cod, date, date_alt) VALUES (@cod, @date, GETDATE());
           END
           fetch next from c_test into @cod, @date
        END

    close c_test
    deallocate c_test

我想执行这样的更新:

update TABLE1 
set date = '2003-07-15 00:00:00.000' 
where cod = 5;

并且我希望将来自 TABLE1 的旧值(更新前的值 2010-12-03 00:00:00.000)插入到 TABLE_AUDIT 中,并且在 TABLE1 之后收到新值 2003-07-15 00 :00:00.000 来自上述更新。

我知道 SQL Server 没有 BEFORE 触发器,所以这是因为我在询问任何替代方案。

谢谢!

【问题讨论】:

触发器中的deleted 表将包含TABLE1 表的旧值。 mssqltips.com/sqlservertip/2342/… Instead Of 触发器取代了 Before 触发器,因为要使其像 Before 触发器一样工作,您只需将更新放在触发器代码的末尾即可。很简单。 检查这个:***.com/questions/19985619/… @TabAlleman 我如何知道触发器内部原始更新的值? 天哪 - 触发器应该快速和精简 - 请不要在触发器内使用光标!这是杀死所有系统性能和可扩展性的可靠方法!使用 基于集合 的方法 - 与您声称的相反,一个简单的 AFTER INSERT 触发器就可以了...... 【参考方案1】:

除了带有光标的性能杀手INSTEAD OF TRIGGER,您可以简单地使用类似这样的后触发器......

CREATE TRIGGER trigger1
ON TABLE1
AFTER UPDATE
AS
BEGIN
   SET NOCOUNT ON;

   INSERT INTO TABLE_AUDIT (cod, [date], date_alt)
   SELECT cod, [date], GETDATE()
   FROM deleted 
END

【讨论】:

+1 - 阿门!!这是执行此操作的方法 - 通常远离光标,并且绝对在触发器中! 这样工作,我删除了光标。非常感谢!

以上是关于日志触发器(更新前)- SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中创建审核触发器

插入前的 SQL Server 触发器

pl/sql 触发器完整性约束问题

帮助 SQL Server 触发器在插入前截断错误数据

sql server 触发器一个结果集变化更新到新表

sql 检测更新触发器中修改的字段(sql server 2005)?