Sql server 使用插入和删除的表进行日志记录-我的概念合理吗?

Sql server 使用插入和删除的表进行日志记录-我的概念合理吗?,sql-server,Sql Server,我有一个带有简单标识列主键的表。我已经编写了一个“For Update”触发器,其中包括将某些列的更改记录到日志表中。不用说,这是我第一次尝试这个 基本如下: Declare Cursor1 Cursor for select a.*, b.* from inserted a inner join deleted b on a.OrderItemId = b.OrderItemId (其中,OrderItemId是主标识键的实际名称) 然后,我执行通常

我有一个带有简单标识列主键的表。我已经编写了一个“For Update”触发器,其中包括将某些列的更改记录到日志表中。不用说,这是我第一次尝试这个

基本如下:

Declare Cursor1 Cursor for 
     select a.*, b.* 
     from inserted a 
     inner join deleted b on a.OrderItemId = b.OrderItemId   
(其中,
OrderItemId
是主标识键的实际名称)

然后,我执行通常的操作,打开光标并进入下一个fetch循环。对于要测试的列,我执行以下操作:

如果更新(字段1) 开始 ..... 做些日志记录 结束

列包括varchar、bits和datetimes。它有时会起作用。问题是log函数正在将字段的a和b值写入日志,在某些情况下,前后值似乎相同

我有两个问题:

  • 我是否正确使用更新功能
  • 我是否正确访问前后值
  • 有更好的办法吗

如果您使用的是SQL Server 2016或更高版本,我建议您完全跳过此触发器,而是使用


它不仅消除了对触发器的需求(以及围绕触发器的性能问题),还可以更轻松地查询历史数据。

您应该尽最大努力避免在触发器中放置光标。触发器应该是非常小、灵活、快速的,而光标绝对不是。。。。。。我建议您花时间研究基于集合的方法-将
插入到选择
,测试
已删除的d
中的列是否与
插入的i
中的列不同:
…其中d.column i.column
,如果是这种情况,则插入数据。@marc\u感谢您贡献宝贵的时间,我将花时间研究基于集合的方法。下面是一篇关于基于集合的触发器的好博客: