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
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语句
来进行更新(尽管在这种简单的情况下它没有什么意义),所以这就是问题的要点。。。不管怎样,我认为我建议的主题比原来的更好,如果你认为你能想出更好的主题,那就去做吧:)