interbase7.1+ibx的触发器问题

lu_zi 2004-04-15 10:01:09
在程序中,使用了触发器来完成其数值自动增加的功能,代码如下:

/* Table: MEMBER, Owner: SYSDBA */

CREATE TABLE "MEMBER"
(
"MEMBER_ID" INTEGER NOT NULL,
"MEMBER_NAME" VARCHAR(20) CHARACTER SET GB_2312 NOT NULL,
"MEMBER_REMARK" BLOB SUB_TYPE BLR SEGMENT SIZE 1024,
CONSTRAINT "PK_MEMBER" PRIMARY KEY ("MEMBER_ID")
);
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "MEMBER_BI" FOR "MEMBER"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.MEMBER_ID IS NULL) THEN
NEW.MEMBER_ID = GEN_ID(GEN_MEMBER_ID,1);
END
^

COMMIT WORK ^
SET TERM ;^

但是在使用IBTable时增加数据提示必须输入MEMBER_ID,怎么搞?
...全文
48 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lu_zi 2004-05-14
虽然我不太赞成你的观点,但是还是会把分给你的,呵呵
  • 打赏
  • 举报
回复
eccalc 2004-04-15
首先,设置自动增值量,不推荐使用TRIGGER。
就是要用TRIGGER也是在IBQuery ,IBDataSet等支持SQL中使用的,一般不是IBTable。
其次,创建了生成器后,不需要创建TRIGGER的,可以设置IBQuery等的IBGeneratorField属性来替代触发器。
这个有很大根源,其实TRIGGER相当于类的事件,你在数据库中定义了TRIGGER,就固定了它的事件(即使你定义了触发优先级也无济于事)。
要知道绑定事件的类是高度不健壮的,特别是在有人继承的情况下。这个问题对应到数据库中就是放在网络中的多人同时触发的情况,自动编号很容易失败(断号和重号)!
有效的解决方案是:定义存储过程,提供调用参数供客户端或者应用服务器控制!
  • 打赏
  • 举报
回复
发帖
数据库及相关技术

1167

社区成员

C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
帖子事件
创建了帖子
2004-04-15 10:01
社区公告
暂无公告