Triggers 更新firebird中触发器中的生成器

Triggers 更新firebird中触发器中的生成器,triggers,generator,firebird,firebird2.5,Triggers,Generator,Firebird,Firebird2.5,我正在使用Firebird数据库的批量导入,这可能会导致生成器出现问题,因为这些生成器不一定要更新 问题是,有没有办法直接在触发器中更新生成器的值 我尝试了以下几点: 开始 如果(new.ID为null),则 开始 new.ID=GEN_ID(mygenerator,1); 结束 否则,如果(new.ID>GEN_ID(mygenerator,0)),则 开始 GEN_ID(mygenerator,new.ID-GEN(ID_mygenerator)); 结束 结束 我还尝试了alterseq

我正在使用Firebird数据库的批量导入,这可能会导致生成器出现问题,因为这些生成器不一定要更新

问题是,有没有办法直接在触发器中更新生成器的值

我尝试了以下几点:

开始
如果(new.ID为null),则
开始
new.ID=GEN_ID(mygenerator,1);
结束
否则,如果(new.ID>GEN_ID(mygenerator,0)),则
开始
GEN_ID(mygenerator,new.ID-GEN(ID_mygenerator));
结束
结束
我还尝试了
altersequence
setgenerator
语句,但在触发器中似乎没有一个语句被接受

有什么建议吗?
注意:我使用的是Firebird 2.5.4

我用Firebird 2.5.5和Flamerobin生成的触发器(有一些小改动)进行了测试。重要的区别似乎是对局部变量的赋值:

使用\u生成器\u BI为激活的\u生成器创建触发器
在插入位置0之前
作为
声明变量tmp-BIGINT;
开始
如果(NEW.ID为NULL),则
NEW.ID=发电机ID(发电机ID为1的发电机);
其他的
开始
tmp=发电机ID(发电机ID为0的发电机);
如果(tmp
可以修改现有代码以分配给临时变量(并使用
GEN_ID
的正确语法)。但是,建议使用此代码,因为您的原始代码(带有修复程序)将具有竞态条件,如果同时另一个操作更改生成器值,使其大于
NEW.ID
,则可能导致生成器反转。在检查和修改之前,通过将
GEN\u ID(GEN\u WITH\u GENERATOR\u ID,0)
的值分配给
tmp
变量,在第一个代码中避免了这种竞争条件


上面的代码可能会显示一个竞争条件,导致将生成器增加到一个比需要的更高的值,但我认为这是很难避免的。还请记住,当使用显式id回滚插入时,生成器值的更改是永久性的,不会回滚。

生成器不在事务控制范围内,因此直接设置该值是不可取的,因为它可能会导致将生成器重置为已分发的值。不过,我希望您的问题中显示的触发器能够工作(尽管您可能需要将
GEN_ID
的结果分配给一个局部变量)。