在SQL Server中确定提供的值和复制的值而不是更新触发器

时间:2013-06-20 15:17:40

标签: sql-server sql-server-2008 triggers

假设我有一张这样的表:

CREATE TABLE [A]
(
  [X] INT,
  [Y] INT,
  [Z] INT
)

..具有而不是更新触发器。如果我在此表中插入一行:

INSERT INTO [A]
  SELECT 1, 1, 1

然后我用这样的代码点击更新触发器:

UPDATE [A]
SET [X] = 2
WHERE [X] = 1

我最终会得到一个[已删除]表格,如下所示:

X:1, Y:1, Z:1

我最终会得到一个像这样的[inserted]表:

X:2, Y:1, Z:1

有没有办法确定只有X实际设置?换句话说,我如何区分:

UPDATE [A]
SET
  [X] = 2,
  [Y] = 1, 
  [Z] = 1
WHERE [X] = 1

......以及上面的陈述?

注意: SQL Server 2008

1 个答案:

答案 0 :(得分:2)

在触发器中,您可以添加WHERE子句来比较旧值和新值,并忽略不变的行。

您可以使用函数UPDATE()但如果旧值和新值相同,它仍然可以为true。它不太可靠。

但是,无法确定触发SET调用的UPDATE子句中的实际列。也就是说,这些与触发器完全相同

UPDATE [A]
SET
  [X] = 2,
  [Y] = 1, 
  [Z] = 1
WHERE [X] = 1

UPDATE [A]
SET [X] = 2
WHERE [X] = 1