概述
--if OBJECT_ID('TR_orders_Insert','TR') IS NOT NULL
--DROP TRIGGER TR_orders_Insert;
--GO
create or replace trigger UD_trigger
before insert or update on emplyq1122 --触发事件 / update of 列 on 表 说明当更改某一列的数据时候才会触发。
referencing
old as oldtuple --给旧行和新行取新的名字,
new as newtuple
for each row -- 每修改一行都需要调用此过程,
-- 对此我们称之为行级触发器,old,和new 才可以使用 insert触发操作 只有 :new
-- delete触发操作 只有 :old; update触发操作 都有。
declare --定义变量
--PRAGMA AUTONOMOUS_TRANSACTION; -- 声明自治事务
my_err exception; --用户自定义错误
errno integer;
errmsg char(200);
minsalary number(10,3);
maxsalary number(10,3);
-- 变量名 表名.字段名%type; //根据表的字段定义变量类型
--WHEN (NEW.job_id = 'SA_REP') 也可以使用when来限制出发条件,当满足的时候才会开始执行下面的begin触发体
begin
–oracle 规定 不能在触发器中写commit,rollback。?????
试想一下,如果在触发器里面可以使用commit,你执行了某个批量更新操作
每一条都执行触发器的操作,即每一条都commit,
这样就无法再进行rollback到整个更新操作之前的状态。
–采用自治事务的方式,可以在trigger里rollback or commit;
–触发器执行规则 : 对于同一个表上的多个before触发器,遵循’谁先创建谁执行的原则’
–2.2 Msyql触发器的trigger_time和trigger_event
现在,重新注意到trigger_time和trigger_event,上文说过, trigger_time可以用before和after替换,表示触发器程序的执行在sql执行的前还是后
;trigger_event可以用 insert,update,delete替换,表示触发器程序在什么类型的sql下会被触发。
在一个表上最多建立6个触发器,即1)before insert型,2)before update型,3)before delete型,4)after insert型,5)after update型,6)after delete型。
触发器的一个限制是不能同时在一个表上建立2个相同类型的触发器。这个限制的一个来源是触发器程序体的“begin和end之间允许运行多个语句”
(摘自mysql使用手册)。
另外还有一点需要注意,msyql除了对insert,update,delete基本操作进行定义外,还定义了load data和replace语句,
而load data和replace语句也能引起上述6中类型的触发器的触发。
Load data语句用于将一个文件装入到一个数据表中,相当与一系列insert操作。replace语句一般来说和insert语句很像,
只是在表中有 primary key和unique索引时,如果插入的数据和原来primary key和unique索引一致时,会先删除原来的数据,
然后增加一条新数据;也就是说,一条replace sql有时候等价于一条insert sql,有时候等价于一条delete sql加上一条insert sql。即是:
? Insert型触发器:可能通过insert语句,load data语句,replace语句触发;
? Update型触发器:可能通过update语句触发;
? Delete型触发器:可能通过delete语句,replace语句触发;
最后
以上就是微笑小懒猪为你收集整理的数据库触发器使用详解,看完这个就够了!的全部内容,希望文章能够帮你解决数据库触发器使用详解,看完这个就够了!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复