数据库触发器使用详解,看完这个就够了!

it2022-05-05  197

--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语句触发;


最新回复(0)