1

假设我有一张这样的桌子:

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

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

INSERT INTO [A]
  SELECT 1, 1, 1

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

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

我最终会得到一个 [deleted] 表,如下所示:

X:1,Y:1,Z:1

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

X:2,Y:1,Z:1

有什么方法可以确定实际上只设置了 X 吗?换句话说,我如何区分:

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

...以及上面的声明?

注意:SQL Server 2008

4

1 回答 1

2

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

您可以使用该功能UPDATE(),但如果旧值和新值相同,它仍然可以为真。它不是很可靠。

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

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

UPDATE [A]
SET [X] = 2
WHERE [X] = 1
于 2013-06-20T15:26:28.313 回答