日志触发器(更新前)- 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的主要内容,如果未能解决你的问题,请参考以下文章