关于 Interbase 触发器的问题(30分)

  • 主题发起人 主题发起人 question
  • 开始时间 开始时间
Q

question

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一数据表(InterBase),有字段三个 aaaa,bbbb,cccc 均为VARCHAR 型
aaaa的长度为 3 ,bbbb为1,cccc 的长度为二。aaaa 是关键字
现在我需要在 Interbase 的触发器中实现当 bbbb 或 cccc 发生更新,就将
bbbb+cccc 的值赋给 aaaa
我写了如下代码
CREATE TRIGGER COUNTYDATATRIGGER1 FOR COUNTYDATA AFTER UPDATE POSITION 0 AS
BEGIN
UPDATE COUNTYDATA SET aaaa=bbbb+cccc WHERE NEW.bbbb <> OLD.bbbb OR NEW.cccc <> OLD.cccc;
END
可是修改数据后就会报错,我错在那里了?
 
试一下:
CREATE TRIGGER COUNTYDATATRIGGER1 FOR COUNTDATA
AFTER UPDATE
POSITION 0 AS
BEGIN
if (old.bbbb<>new.bbbb or old.cccc<>new.cccc) then
UPDATE COUNTDATA SET aaaa=bbbb+cccc;
END

另外:
1. aaaa=bbbb+cccc是否意味着bbbb和cccc都是数值型字符串?
InterBase的字符串相加运算符是||
2. 为了保证aaaa 和 bbbb,cccc数据的一致性, 最好给COUNTDATA加上
INSERT触发器.
 
试一下:
CREATE TRIGGER COUNTYDATATRIGGER1 FOR COUNTYDATA
AFTER UPDATE
POSITION 0 AS
BEGIN
if (old.bbbb<>new.bbbb or old.cccc<>new.cccc) then
UPDATE COUNTYDATA SET aaaa=bbbb+cccc;
END

另外:
1. aaaa=bbbb+cccc是否意味着bbbb和cccc都是数值型字符串?
InterBase的字符串相加运算符是||
2. 为了保证aaaa 和 bbbb,cccc数据的一致性, 最好给COUNTDATA加上
INSERT触发器.
 
刚才疏忽了UPDATE语句,导致把你所有的aaaa都更新了!

正确的做法如下:

CREATE TRIGGER COUNTYDATATRIGGER1 FOR COUNTDATA
BEFORE UPDATE
POSITION 0
AS
BEGIN
if (old.bbbb<>new.bbbb or old.cccc<>new.cccc) then
new.aaaa=new.bbbb + new.cccc;
END

(注意将原来的AFTER UPDATE 改为 BEFORE UPDATE)
 
我打算接受你的答案了
不过你并没有回答我的问题,我要的是 After Update 而你却要求 before update
不过你最有价值的回答是:InterBase的字符串相加运算符是||
这个才帮助了我,我已经搞定了。谢谢你。
明天给积分给你, Good Luck
 
Hi,question
之所以用before update是为了提高你程序的效率,简化编程.当然你程序
可能还有特殊需求.
如果用after update, 可以将条件句中的内容用 UPDATE, 相信你已经
解决了.
 
接受答案了.
 
后退
顶部