informix数据库触发器的写法
虽然有各种数据库,但触发器的原理都是一样的,懂一种数据库的写法就可以了解其他的。
以前写过mysql数据库的触发器,这次写informix的,还顺带看了oracle的,除了语法上的不同,informix和他们还是有一些差异的。
一、触发器介绍
触发器是响应数据库动作自动执行的一条sql语句。写好触发器之后,它就是自动的了。
触发器需要的信息:
1.唯一的触发器名称
2.触发器关联的表
3.应该响应的事件(insert、update、delete)
4.何时执行(处理之前before、之后after、处理中for each row),对应前置触发器、后置触发器、。。。
5.如果响应之前的触发器执行失败,响应则不会执行。
前置触发器----响应----后置触发器
其中某一个失败,后面的将无法执行
二、informix触发器用法
1⃣️insert触发器语法([]里是选填,()里是必填)
CREATE TRIGGER trigger_name INSERT ON table_name
BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)|
FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)|
AFTER [WHEN (condition)] (trig_action1,trig_action2,...)|
[DISABLED|ENABLED]
或者for each row之前加上REFERENCING NEW AS correlation_name。在insert触发器中可引用一个名为new的虚拟表,访问被插入的行的值。在前置触发器中,new表值为即将被插入的值。在后置触发器中,new表值为刚刚插入的值。
ENABLED指定启动触发器,即执行触发器事件时即激活触发器。这是生成触发器时的默认值。
DISABLED指定生成但关闭触发器,即执行触发器事件时不激活触发器。
CREATE TRIGGER insert_customer
INSERT ON customer -- 触发事件
REFERENCING NEW AS post
FOR EACH ROW
(INSERT INTO customer_summary VALUES (post.num, post.name)); -- 触发动作 这个实例在customer表中创建了一个名为insert_customer的insert类型的触发器。这个触发器影响在customer表中插入的每一行。在该表记录插入时,触发器附加执行了如下操作:
INSERT INTO customer_summary VALUES (post.num, post.name);
2⃣️delete触发器语法:
CREATE TRIGGER trigger_name DELETE ON table_name
BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)|
FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)|
AFTER [WHEN (condition)] (trig_action1,trig_action2,...)|
[DISABLED|ENABLED]
或者for each row之前加上REFERENCING NEW AS correlation_name
例子:
CREATE TRIGGER delete_customer
DELETE ON customer -- 触发事件
BEFORE ( EXECUTE PROCEDURE log_customer_proc( ) ); -- 触发动作 上面的实例在customer表中创建了一个名为delete_customer的delete类型的触发器。这个触发器将在customer中的一条或者多条数据做删除操作时被执行。当这个触发器被触发时,在这之前需要执行log_customer_proc存储过程来记录日志。
3⃣️update触发器语法:
CREATE TRIGGER trigger_name UPDATE [OF (column,column,...)] ON table_name
BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)|
FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)|
AFTER [WHEN (condition)] (trig_action1,trig_action2,...)|
[DISABLED|ENABLED]
或者for each row之前加上REFERENCING NEW AS correlation_name OLD AS correlation_name。在before update,before insert触发器中,new对象的值可以被更新。
delete和update触发器中可以引用一个名为old的虚拟表,访问被删除的行。old表中的值是只读的。
CREATE TRIGGER update_unit_price
UPDATE OF unit_price ON stock -- 触发事件
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW WHEN (post.unit_price > pre.unit_price * 2)
( INSERT INTO warn_table VALUES(pre.stock_num, pre.manu_code,pre.unit_price, post.unit_price, CURRENT) ); -- 触发动作 这个实例在stock表中创建了一个名为update_unit_price的update触发器。这个触发器会在unit_price字段被更新时执行。当这个触发器起作用的时候,触发器的动作将在每一条满足post.unit_price > pre.unit_price*2条件时的记录。
4⃣️我写的例子
//创建序列
CREATE SEQUENCE seq_test
INCREMENT BY 1
START WITH 1
MAXVALUE 1000
MINVALUE 0
CYCLE
CACHE 10
ORDER;
//创建测试表
CREATE TABLE
testa
(
id INTEGER,
ename VARCHAR(100),
age INTEGER,
address VARCHAR(100),
memo VARCHAR(100)
);
CREATE TABLE
testb
(
id INTEGER
);
//测试序列
select seq_test.nextVAL from testa;
//创建触发器
--testa insert之前,insert一条记录到testb,值由序列产生
create trigger TRI_testa
insert on testa
before (
insert into testb(id)values(seq_test.nextVAL)
)
--testa insert的同时,insert一条记录到testb
CREATE TRIGGER tri_testa3
insert ON testa
REFERENCING NEW AS post
for each row(
INSERT INTO testb(id)values(seq_test.nextval)
)
--testa insert的同时,insert一条记录到testb,值是testa表的ID值
CREATE TRIGGER tri_testa4
insert ON testa
REFERENCING NEW AS post
for each row(
INSERT INTO testb(id)values(post.id)
);
--测试tri_testa4 :insert into testa(id,ename,age,address,memo)values('100','jerry',20,'addressjerry','memo')
5⃣️删除触发器
drop trigger tri_testa;
三、informix触发器的差异
mysql中只有before、after两种执行点
mysql只能在表上创建触发器,不能在视图上创建。informix则可以在表和视图上创建。
四、数据报错查询网站
在查问题时,发现了一个叫Oninit的网站http://www.oninit.com/suppservices/index.php 在浏览器中输入数据库报错的信息,或者在这个网站上直接搜索,能看到报错信息产生的原因

五、遇到的问题,有知道情况的亲烦请告知,多谢!
遇到了一个问题,在网上查了也无解。问题是这样的:informix库需要做一个触发器,在insert到testa表数据前(或者过程中),把testa表的ID更新成序列值。
网上查的结果:没有这样的用法。
但oracle有这样的用法,如下:
create or replace trigger TRI_test before insert
on testa for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean; begin
-- Column "ID" uses sequence SequenceGen
select seq_test.NEXTVAL INTO :new.ID from dual; -- Errors handling
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
所以我就试着参考其他数据库的方法写了下面的代码:这些代码都有不同的问题,最终不能实现。
CREATE TRIGGER tri_testa5 --创建时不报错
insert ON testa
REFERENCING NEW AS post --informix的insert触发器没有old表
for each row(
INSERT INTO testa(id)values(post.id)
);
--insert时才报错
insert into testa(id,ename,age,address,memo)values('','jerry',20,'addressjerry','memo'); CREATE TRIGGER tri_testa6 --创建时不报错
insert ON testa
REFERENCING NEW AS post
for each row(
INSERT INTO testa(id)values(seq_test.nextval)
);
--insert时才报错
insert into testa(ename,age,address,memo)values('jerry',20,'addressjerry','memo'); CREATE TRIGGER tri_testa6 --创建时报错
insert ON testa
before(
INSERT INTO testa(id)values(seq_test.nextval)
);
--报错信息:This error is returned when a triggered SQL statement acts on the triggering table, or when both statements are updates, and the column that is updated in the triggered action is the same as the column that the triggering statement updates.也就是说,不能在触发事件和触发器执行的内容里,更新同一个表
后来和同事讨论后觉得,既然报错,那说明不支持这种用法吧!有知道这种情况是怎么回事的亲,烦请评论或者私信告知一下,也好揭开我的疑惑,多谢啦!
informix数据库触发器的写法的更多相关文章
- sqlserver数据库触发器调用外部exe
sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...
- 蜜果私塾:informix数据库学习合集[不断补充]
一.infomix使用备忘录 目录结构: 1. 启动与停止命令: 2. 修改数据库编码: 3. 查看informix占用的端口: 4. 使用dbacces ...
- 为Informix数据库开启事务
1.首先在Informix数据库安装根目录的etc文件夹下找到名为ONCONFIG.on_xxxx的配置文件: 2.打开ONCONFIG.on_xxxx文件,在第409行的位置找到TAPEDEV \\ ...
- INFORMIX数据库常用命令
INFORMIX数据库常用命令 一.onstat命令集 1.onstat - 说明:查看数据库当前的状态 用法:onstat - 2.onstat -c 说明:查看数据库的配置文件 用法:ons ...
- ODBC方式连接Informix数据库
公司某个报表系统使用Informix数据库,在谋划使用Perl语言写数据采集程序后,花费了很多时间建立Perl访问Informix连接.恰巧Windows下ActivePerl的CPAN中又没有DBD ...
- 数据库触发器new old
数据库触发器new old: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . col ...
- Mysql数据库触发器调用脚本
一.数据库触发器 mysql触发器trigger 实例详解 对数据库触发器new和old的理解 示例 二.UDF mySql的UDF是什么 三.安装执行命令UDF mysql触发器调用外部脚本(安装) ...
- GoldenGate抽取Informix数据库安装及配置
GoldenGate抽取Informix数据库安装及配置 本次测试架构 l 在中间机上安装informix csdk4.10版本,并编译配置unixODBC; l 在中间机上安装ogg for I ...
- informix数据库知识积累
一.嵌套查询 informix子查询:嵌套查询(1)select first 20 * from (select first 40 * from hlrquery_log order by id de ...
随机推荐
- Shell脚本编程基础笔记二
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8177697.html 一:输入 1:运行时参数 可以在启动脚本时,在其后输入参数. ./脚本 参数1 参数2. ...
- ios中输入框的父类--文本框,DataPick,pickerview
父控制器 #import <UIKit/UIKit.h> #import "ScrollViewExt.h" @interface BaseKeyBoardCtrl : ...
- 外贸圈 贸易经 外贸心路 一位成功外贸人的SOHO心得
一位成功外贸人的SOHO心得 外贸圈http://waimaoquan.alibaba.com/wm Jade,高中毕业,93年进入外贸行业,刚开始,只是在公司的外贸仓库工作,10多年后的今天,他已成 ...
- 【转】redis 消息队列发布订阅模式spring boot实现
最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...
- java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
之前一直以为 this关键字 是指调用者对象,但是这次才真正理解,this代表当前对象,但是指向调用者对象,其实就是多态的用法,如下所示:B 继承了 A,在B 中调用A类的方法,在A 中用this 访 ...
- 十大高明的Google搜索技巧
WHY 对于google检索,有时需要技巧会得到更好的检索结果,不用简单输入关键字检索后,一个个去浏览.对于这些技巧,基本都知道,但是如果不经常用,总是忘了,又得重新搜索下具体使用方法,这里就把它放到 ...
- 浅析tornado 中demo的 blog模块
#!/usr/bin/env python # # Copyright 2009 Facebook # # Licensed under the Apache License, Version 2.0 ...
- 9patch图的尺寸尽量为偶数
美工做了一张.9的背景图,宽度110*80 像素,描点如下: 放到720p的智能电视上观看,总感觉怪怪的.仔细观看可以发现,前景图总是不能完全的覆盖掉背景图.总有那么一个像素的点多余出来,如图所示: ...
- Java知多少(40)接口和抽象类的区别
类是对象的模板,抽象类和接口可以看做是具体的类的模板. 由于从某种角度讲,接口是一种特殊的抽象类,它们的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊.我们首先分析它们具有的相同点. ...
- (原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况
转载请注明出处:http://www.cnblogs.com/lihaiping/p/6612511.html 今天同事准备在android下使用ffmpeg来获取rtsp流,问我如何获取获取sps ...