0

使用 Microsoft SQL Server,我正在编写一个用于更新表的 SQL 触发器,但我被卡住了。我对 SQL 不是很精通,所以它可能是我缺少的一些基本知识。

CREATE TRIGGER test
ON  tableName
AFTER UPDATE
AS 
BEGIN
DECLARE @variableA int
SELECT @variableA = variableA FROM DELETED

DECLARE @variableB int
SELECT @variableB = variableB FROM INSERTED;

f(@variableA <> @variableB )
BEGIN
//Do What I want
END

这可以正常工作,因为它在两个变量不同时执行操作。但是,我不想考虑 tableName 中的所有记录。

我编写了以下内容以仅获取我想要的条目。

WITH
table (variableID, variable)
AS
(
    SELECT variableID, variable
    FROM tableName
    WHERE variable= 'value'
)

SELECT * FROM table

所以我想要的是将触发器仅应用于 SELECT 中找到的值。我会以正确的方式解决这个问题吗?

4

1 回答 1

2

不能保证查询一次UPDATE只影响一行,并且您的查询INSERTED需要DELETED反映这一点以确保安全。检测更改值的最简单方法可能是连接主键上的两个触发器表。

CREATE TRIGGER test ON tableName
AFTER UPDATE AS 
BEGIN
  IF EXISTS (
    SELECT * FROM INSERTED I
      INNER JOIN DELETED D ON I.variableID = D.variableID
      WHERE D.VariableA <> I.VariableB
        /* AND further conditions */
  ) BEGIN
    -- Perform your action
  END
END

此代码段/* AND further conditions */所在的位置是在运行操作之前插入您想要对数据执行的额外检查的好地方。

例如,您可以将操作限制在更新variable之前'value' 的位置...

AND D.variable = 'value'

或更新variable设置'value' 的位置...

AND I.variable = 'value'
于 2013-10-29T12:44:03.540 回答