2011-12-20 57 views
2

我想写一个触发器就像下面这个简单的例子:如何在informix中创建触发器?

create trigger adr_trg update of fname, lname on adr 
REFERENCING OLD AS o NEW AS n 
FOR EACH ROW 
(
    IF o.fname <> n.fname THEN 
    insert into adrlog (old_value, new_value) 
    values (o.fname, n.fname); 
    END IF; 

    IF o.lname <> n.lname THEN 
    insert into adrlog (old_value, new_value) 
    values (o.lname, n.lname); 
    END IF; 
) 

这种失败!

只有这样工作的:

create trigger adr_trg update of fname, lname on adr 
REFERENCING OLD AS o NEW AS n 
FOR EACH ROW 
(
    insert into adrlog (old_value, new_value) 
    values (o.fname, n.fname); 
) 

我在做什么错?

回答

3

我想你应该用IF-THEN逻辑编写一个存储过程,并从这个触发器中调用它。我认为触发器仅支持简单的SQL语句,而不是SPL语句

编辑:

CREATE PROCEDURE proc1() 
REFERENCING OLD AS o NEW AS n FOR tab1; 
....your logic 


CREATE TRIGGER adr_trg update of fname, lname on adr 
REFERENCING OLD AS o NEW AS n 
    FOR EACH ROW(EXECUTE PROCEDURE proc1() WITH TRIGGER REFERENCES); 
+0

是啊,我想你是对的。可悲的是,Informix s * cks ... – PeterP

+0

一个好的匠人从来不会责怪他的工具。在我看来,你所需要的条件逻辑最好放在一个过程中。它可能被证明具有足够的通用性,可用于多个表格,以OO方式使用。你的简单例子当然表明这一点。 – RET

+0

[参考,这里是相关的手册页](http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.sqls.doc/sqls521.htm) –

2

老问题,但没有得到很好的回答,万一有人在这里像我一样的土地了。

Informix的处理请求的功能,但语法是不同的:

create trigger adr_trg update of fname,lname on adr 
referencing old as o new as n 
    for each row 
    when (o.fname != n.fname) 
    (
     insert into adrlog (old_value,new_value) 
     values (o.fname,n.fname) 
    ) , 
    when (o.lname != n.lname) 
    (
     insert into adrlog (old_value,new_value) 
     values (o.lname,n.lname) 
    ) 
;