use*_*473 1 informix eventtrigger
我想在插入之前更改几个列值.我使用Informix作为数据库.
我有一个由3列组成的表:名称(NVARCHAR),类型(INT),计划(NVARCHAR).
每次插入新记录时,我都想在插入之前检查Name值.如果名称以F开头,我想将Type值设置为1,将Plan Name设置为"Test"
简而言之,我想要触发器做的是:
我在BEFORE和AFTER之后查找了CREATE TRIGGER语句.但是,我想有一个更清楚的例子.我的情况可能会涉及BEFORE.
@ 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)
| 归档时间: |
|
| 查看次数: |
5005 次 |
| 最近记录: |