Sybase触发器执行时数据更新不正确

时间:2015-01-20 22:15:43

标签: triggers sybase-ase sybase-asa

我有一个表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_1tinyint_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

1 个答案:

答案 0 :(得分:1)

ASE不支持ROW级触发器。只有语句后触发器。

如前所述,您遇到的问题是您需要能够将'inserted'伪表中的行链接到基表本身。只有存在密钥时才能执行此操作 - 意味着:唯一标识行的列或执行此操作的列组合。没有它,您根本无法识别需要更新的行,因为如果不保证唯一性,则可能有多个行具有相同的列值。 (并且在旁注:表中没有键是糟糕的设计实践 - 这个问题是原因之一)。

一个简单的解决方案是向表中添加一个标识列,例如

ALTER TABLE test_123 ADD idcol INT IDENTITY NOT NULL

然后,您可以在触发器连接中添加谓词'test_123.idcol = inserted.idcol'