如何根据使用触发器修改的记录的值更新另一个表上的记录

Art*_*tik 1 firebird triggers sql-update

我有两个简单的(仅用于解释我的问题)表

  1. X与列(以及其他):IDX,CODE,NUMBER
  2. Y与列(以及其他):CODE,NUMBER,id_fromX

我想(在插入或更新表X之后)更新表Y使用来自X的实际记录中的变量.为此,我尝试使用触发器(在表X中),如下所示:

SET TERM ^^ ;
CREATE TRIGGER XYZFOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
  if  (new.CODE is distinct old.CODE)  then
  BEGIN
  EXECUTE STATEMENT ('UPDATE Y SET CODE=:old.CODE, id_fromX=:old.IDX WHERE NUMBER=:old.NUMBER');
  END
end ^^
Run Code Online (Sandbox Code Playgroud)

但我从服务器收到错误:

Execute statement error at jrd8_prepare :\
335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 1, column 23
335544382 : .
Statement : UPDATE Y SET CODE=:old.CODE, id_fromX=:old.IDX WHERE NUMBER=:old.NUMBER\
Data source : Internal::
At trigger 'XYZ' line: 15, col: 7
Run Code Online (Sandbox Code Playgroud)

静态更新如下:

CREATE TRIGGER XYZ FOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
if  (new.CODE is distinct from old.CODE)  then
BEGIN
EXECUTE STATEMENT ('UPDATE Y SET CODE=1, id_fromX=111 WHERE NUMBER=1');
END
end ^^
SET TERM ; ^^
Run Code Online (Sandbox Code Playgroud)

工作完美.如何引用X表字段来更新表Y(具有相似名称的字段)?

jac*_*ate 5

您正在使用冒号,但旧/新记录不使用冒号.此外,不要在此处使用execute语句,因为sql语句是静态的.

将其更改为:

SET TERM ^^ ;
CREATE TRIGGER XYZFOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
  if  (new.CODE is distinct old.CODE)  then
  BEGIN
    UPDATE Y 
       SET CODE = old.CODE, id_fromX = old.IDX 
     WHERE NUMBER = old.NUMBER;
  END
end ^^
Run Code Online (Sandbox Code Playgroud)