Informix触发器更改插入的值

use*_*473 1 informix eventtrigger

我想在插入之前更改几个列值.我使用Informix作为数据库.

我有一个由3列组成的表:名称(NVARCHAR),类型(INT),计划(NVARCHAR).

每次插入新记录时,我都想在插入之前检查Name值.如果名称以F开头,我想将Type值设置为1,将Plan Name设置为"Test"

简而言之,我想要触发器做的是:

  1. 对于每个新插入,首先检查Name值是否以F开头.
  2. 如果是,请将Type和Plan设置为1,然后将"Test"设置为"Test".
  3. 如果不是,请按原样插入值.

我在BEFORE和AFTER之后查找了CREATE TRIGGER语句.但是,我想有一个更清楚的例子.我的情况可能会涉及BEFORE.

cei*_*art 5

@ user3243781的答案得到了关闭,但是没有用,因为它返回错误:

-747表或列匹配触发语句中引用的对象.

当触发的SQL语句作用于触发表时,或者当两个语句都是更新时,并且触发的操作中更新的列与触发语句更新的列相同时,将返回此错误.

所以替代方案是直接处理NEW变量.为此,您需要使用带有触发器引用资源的过程,这意味着该过程将能够像self一样触发.

下面是我通过Informix v11.70使用dbaccess运行的示例.
据我所知,此资源仅适用于引擎的+11版本.

create table teste ( Name NVARCHAR(100), Type INT , Plan NVARCHAR(100) );
Table created.

create procedure check_name_values()
  referencing new as n for teste ;;

  define check_type integer ;;
  define check_plan NVARCHAR ;;

  if upper(n.name) like 'F%' then
    let n.type = 1;;
    let n.plan = "Test";;

  end if
end procedure ;
Routine created.

;

create trigger trg_tablename_ins
    insert on teste
    referencing new as new
    for each row
    (
            execute procedure check_name_values() with trigger references

    );
Trigger created.

insert into teste values ('cesar',99,'myplan');
1 row(s) inserted.
insert into teste (name) values ('fernando');
1 row(s) inserted.
insert into teste values ('Fernando',100,'your plan');
1 row(s) inserted.



select * from teste ;
name  cesar
type  99
plan  myplan

name  fernando
type  1
plan  Test

name  Fernando
type  1
plan  Test

3 row(s) retrieved.



drop table if exists teste;
Table dropped.


drop procedure if exists check_name_values;
Routine dropped.
Run Code Online (Sandbox Code Playgroud)