Sql Firebird简单触发器不会执行(死锁/并发更新)

Sql Firebird简单触发器不会执行(死锁/并发更新),sql,firebird,triggers,Sql,Firebird,Triggers,您好,我正在使用本地Firebird数据库(2.5),该数据库主要是通过编程方式创建和处理的(属于我无权访问的受版权保护的应用程序的一部分)。 真正困难的是,我根本无法更改应用程序使用的表,更重要的是,由于它的设计(空/重复/一般不良结构),我无法设置任何外键 我试图做的是创建一组触发器,在insert上从其他表中提取数据 例如,当应用程序插入带有列的作业记录时 (作业ID、地址\u ID等) 我想从ADDRESSES表中引用ADDRESS1 所以我试着: CREATE TRIGGER JOB

您好,我正在使用本地Firebird数据库(2.5),该数据库主要是通过编程方式创建和处理的(属于我无权访问的受版权保护的应用程序的一部分)。 真正困难的是,我根本无法更改应用程序使用的表,更重要的是,由于它的设计(空/重复/一般不良结构),我无法设置任何外键

我试图做的是创建一组触发器,在insert上从其他表中提取数据

例如,当应用程序插入带有列的作业记录时 (作业ID、地址\u ID等) 我想从ADDRESSES表中引用ADDRESS1 所以我试着:

 CREATE TRIGGER JOBS_FKs FOR JOBS_SQL
ACTIVE before INSERT POSITION 0
AS 
BEGIN 
  NEW.ADDRESS1 =(SELECT FIRST 1 ADDRESS1 FROM SC_ADDRESS WHERE ADDRESS_ID=NEW.ADDRESS_ID);
END^

SELECT FIRST 1 ADDRESS1 FROM SC_ADDRESS WHERE ADDRESS_ID=NEW.ADDRESS_ID INTO NEW.ADDRESS1
UPDATE JOBS_SQL  SET...

SELECT FIRST 1 ADDRESS1 FROM SC_ADDRESS WHERE ADDRESS_ID=NEW.ADDRESS_ID INTO NEW.ADDRESS1
UPDATE JOBS_SQL  SET...
但我总是发现:更新与并发更新冲突 我还尝试了“在事务提交时插入”之前,但没有成功


是我做错了什么,还是触发器根本不是答案?

一般来说,您不应该在触发器中使用
UPDATE
来更新应用触发器的表(如第三个示例所示)。但是,我不希望触发器使用
NEW
上下文(如第一个和第二个示例中所示)导致更新冲突。您确定在没有触发器(或空触发器)的情况下不会出现此错误吗?您可能还希望检查应用程序的事务是否使用
no\u rec\u version
作为事务选项之一。错误发生在我尝试提交触发器时,但在您说我已经尝试了它(第一个触发器)之后在一个测试数据库上,它通过了良好的测试。因此,可能是其他原因导致了冲突。我的意思是,否则您是否认为这样一个触发器(假定它在一个相当短的时间内执行)可能会以某种方式阻止或影响对原始表的插入?您得到的错误意味着两个并发事务试图更新同一条记录。顺便说一句:你能澄清一下“触发”是什么意思吗。如果在提交数据库DDL时发生此错误,则与触发触发器时出现此错误完全不同。抱歉,我的意思是它不创建触发器。FlameRobin是一个检查语法然后提交更改的系统