2014-01-27 57 views
1

我想在插入之前更改一些列值。 我使用Informix作为数据库。我有一个由3列组成的表:Name(NVARCHAR),Type(INT),Plan(NVARCHAR)。Informix触发器更改插入值

每次插入新记录时,我想在插入它之前检查Name值。如果名称与F开头,我想设置的类型值设置为1,计划名称为“测试”

总之,我想要什么触发做的是:

  1. 每新插入,首先检查名称值是否以F开头。
  2. 如果是,请将类型和计划设置为1,然后插入“测试”。
  3. 如果否,请按原样插入值。

我用BEFORE和AFTER查找了CREATE TRIGGER语句。不过,我想有一个更清晰的例子。不过,我的情况可能会涉及到BEFORE。

回答

0
create trigger trg_tablename_ins 
    insert on tablename 
    referencing new as new 
    for each row 
    (
      execute procedure check_name_values 
      (
        new.name, 
        new.type, 
        new.plan 
      ) 

    ); 



create procedure check_name_values 
(
    name NVARCHAR, 
    new_type integer, 
    new_plan NVARCHAR, 
) 
define check_type integer ; 
define check_plan NVARCHAR ; 

    let check_type = 1; 
    let check_plan = "Test"; 

    if name = 'F%' 
    then 
     insert into tablename (name,type,plan) values (name,check_type,check_plan); 
    else 
     insert into tablename (name,type,plan) values (name,new_type,new_plan); 
    end if ; 

end procedure ; 
5

@ user3243781的答案接近,但不是因为工作,返回错误:

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

时触发的SQL语句作用于 触发表,或当两个语句的更新,并且在触发的操作更新的列 是一样的列返回此错误是 触发语句更新。

因此,替代方法是直接处理NEW变量。 为此,您需要使用一个与触发器参考资源的过程,这意味着该过程将能够像自己触发一样。

下面是我用dbaccess在Informix v11.70上运行的示例。
此资源仅适用于引擎版本+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.