我有一个表test_123
,其列为:
int_1 (int),
datetime_1 (datetime),
tinyint_1 (tinyint),
datetime_2 (datetime)
因此,当列datetime_1
更新且列tinyint_1
= 1的值时,我必须更新列datetime_2
的列datetime_1
我为此创建了以下触发器..但是当我datetime2
= 1时,我的触发器会更新所有datetime_1
列tinyint_1
列但我只是想更新datetime_1
值已更新的特定行(我的意思是更改)..
以下是触发器..
CREATE TRIGGER test_trigger_upd
ON test_123
FOR UPDATE
AS
FOR EACH STATEMENT
IF UPDATE(datetime_1)
BEGIN
UPDATE test_123
SET test_123.datetime_2 = inserted.datetime_1
WHERE test_123.tinyint_1 = 1
END
答案 0 :(得分:1)
ASE不支持ROW级触发器。只有语句后触发器。
如前所述,您遇到的问题是您需要能够将'inserted'伪表中的行链接到基表本身。只有存在密钥时才能执行此操作 - 意味着:唯一标识行的列或执行此操作的列组合。没有它,您根本无法识别需要更新的行,因为如果不保证唯一性,则可能有多个行具有相同的列值。 (并且在旁注:表中没有键是糟糕的设计实践 - 这个问题是原因之一)。
一个简单的解决方案是向表中添加一个标识列,例如
ALTER TABLE test_123 ADD idcol INT IDENTITY NOT NULL
然后,您可以在触发器连接中添加谓词'test_123.idcol = inserted.idcol'
。