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

Triggers 如何基于使用触发器修改的记录值更新另一个表上的记录,triggers,sql-update,firebird,Triggers,Sql Update,Firebird,我有两个简单的表格(仅用于解释我的问题) 带列的X(除其他外):IDX、代码、编号 Y与列(除其他外):代码、编号、id\u fromX 我想(在插入或更新表X之后)使用来自X的实际记录的变量更新表Y。 为此,我尝试使用触发器(在表X中),如下所示: SET TERM ^^ ; CREATE TRIGGER XYZFOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS begin if (new.CODE is distinct old.CODE

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

  • 带列的X(除其他外):IDX、代码、编号
  • Y与列(除其他外):代码、编号、id\u fromX
  • 我想(在插入或更新表X之后)使用来自X的实际记录的变量更新表Y。 为此,我尝试使用触发器(在表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 ^^
    
    但我从服务器上得到错误信息:

    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
    
    静态更新如下所示:

    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 ; ^^
    
    工作完美。
    如何引用X表字段来更新表Y(具有类似名称的字段)?

    不应:old.CODE为old.CODE?

    不应:old.CODE为old.CODE为old.CODE?

    您使用的是冒号,但旧/新记录不使用它。另外,这里不要使用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 ^^
    

    您正在使用冒号,但旧/新记录不使用它。另外,这里不要使用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 ^^
    

    不能使用
    EXECUTE语句
    将参数直接写入语句,有关正确语法,请参阅。基本上,应该是这样的

    EXECUTE STATEMENT ('UPDATE Y SET CODE = :CODE, id_fromX = :IDX WHERE NUMBER=:NUMBER')
    (CODE := old.CODE, IDX := old.IDX, NUMBER := old.NUMBER);
    

    但实际上您不需要执行语句,在这里,请“直接”使用UPDATE语句。

    您不能使用执行语句将参数直接写入语句,请参阅以了解正确的语法。基本上,应该是这样的

    EXECUTE STATEMENT ('UPDATE Y SET CODE = :CODE, id_fromX = :IDX WHERE NUMBER=:NUMBER')
    (CODE := old.CODE, IDX := old.IDX, NUMBER := old.NUMBER);
    

    但是实际上您不需要这里的
    EXECUTE语句
    ,直接使用UPDATE语句。

    您不能在
    EXECUTE语句
    中使用触发器上下文变量(
    old.
    new.
    ),因为它们是单独的上下文(
    EXECUTE语句
    中的语句看不到它们)。您要么需要使用正常的
    更新
    语句而不诉诸
    执行语句
    ,要么应该通过。比如:


    不能在
    EXECUTE语句中使用触发器上下文变量(
    old.
    new.
    ),因为它们是单独的上下文(在
    EXECUTE语句中的语句看不到它们)。您要么需要使用正常的
    更新
    语句而不诉诸
    执行语句
    ,要么应该通过。比如:


    谢谢,但不幸的是类似错误(未知列):“jrd8处执行语句错误\u准备:\335544569:动态SQL错误335544436:SQL错误代码=-206 335544578:列未知335544382:旧。编号336397208:在第1行,第63列语句:UPDATE Y SET code=OLD.code,id\u fromX=OLD.IDX,其中NUMBER=OLD。编号\数据源:内部::在触发器'XYZ'行:15,列:7“谢谢,但不幸的是类似错误(未知列):“jrd8处执行语句错误\u准备:\335544569:动态SQL错误335544436:SQL错误代码=-206 335544578:列未知335544382:旧。编号336397208:在第1行,第63列语句:UPDATE Y SET code=OLD.code,id\u fromX=OLD.IDX,其中NUMBER=OLD。编号\数据源:内部::在触发器'XYZ'行:15,列:7“@ain IMHO,标题仍然是错误的,因为问题不在于如何使用execute语句,而在于如何根据正在修改的记录的值更新其他表上的记录。(带或不带execute语句)。嗯,我认为OP真的想使用
    execute语句
    来进行更新(尽管在这种简单的情况下它没有什么意义),所以这就是问题的要点。。。无论如何,我认为我建议的主题比原来的更好,如果你认为你能想出更好的主题,那就去做吧:)@ain IMHO,标题仍然是错误的,因为问题不是如何使用execute语句,而是如何根据被修改记录的值更新其他表上的记录。(带或不带execute语句)。嗯,我认为OP真的想使用
    execute语句
    来进行更新(尽管在这种简单的情况下它没有什么意义),所以这就是问题的要点。。。不管怎样,我认为我建议的主题比原来的更好,如果你认为你能想出更好的主题,那就去做吧:)