⽬录
1.
2.
3.
1.
2.
3. oracle触发器加条件判断
oracle触发器加条件判断,如果某个字段,isnode=0,那么不执⾏下⾯的⽅法,数据如下:
create or replace trigger tr_basestation_insert_emp
before insert on BJLT.BASESTATION
REFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值
for each row
when (new_val.isnode =0)
declare
--local variables here
begin
insert into BSMS.BS_INFO@TOBSMS_BETTERY_LOCAL.REGRESS.RDBMS.DEV.US.ORACLE.COM(INFOID, INFONAME, GROUPID, ADDRESS, BUILDDATE, MAINTENANCER, TEL, TEMPERATURE, RECTIFIERCUR, OUTVOL, CREATETIME, SORTID, ONEOFFVOL, TWOOFFVOL, ISNODE, NODENUM, ONOFFPOWER, ONOFFPOWERMODEL,
POWERA, POWERB, POWERC, POWEROUT, POWERACUR, POWERBCUR, POWERCCUR, POWERAVOL, POWERBVOL,
POWERCVOL, DOOROPEN, HS, YANGAN, SHUIJIN, HONGWAI, KONGTIAO, VERID)
values ('1','1','8a82fcd4-eba9-4f83-82d6-8ded897f3f10',
'1',sysdate,'1',
'1',0,'1',
1,sysdate,1,
1,1,1,
1,'1','1',
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,
1);
end;
参考⾃:blog.csdn/weiwenhp/article/details/9179891
trigger和procedure,function类似,只不过它不能被显⽰调⽤,只能被某个事件触发然后oracle⾃动去调⽤.常⽤的⼀般是针对⼀个表或视图创建⼀个
trigger,然后对表或视图做某些操作时触发trigger.当然除此之外还有,schema,database级别的 trigger.
什么样的操作触发trigger
常见的是DML(insert,update,delete) , DDL(create,alter,drop)语句.
不常见的是schema级别trigger在session连接或断开时触发.database级别trigger在系统启动或退出时触发.
你可能很容易发现如果是select查询操作就没法⽤到trigger,⽽有时可能我们想监测谁查看了⼀些敏感信息,此时只能⽤到⼀个叫FGA的东东,可以创建⼀个审计策略(可以看成加强
版的trigger,FGA介绍详见:)
使⽤触发器注意事项
1.触发器不接受参数,⼀个表最多可有12个触发器(触发器类型刚好是12种),并且同⼀时间,同⼀事件,同⼀类型的触发器只能有⼀个(保证触发器操作不冲突嘛).
2.触发器最⼤为32KB,由于⼤⼩受到限制⾃然也不能使⽤long,blob这样的⼤变量.如果实在是有复杂的逻辑,要弄个很复杂的触发器,可以通过procedure或function实现⼀部分功能,
然后调⽤
3.因为触发器实际上可以看作触发语句的⼀部分.所以得遵循⼀些约束条件,⽐如不能有事务控制语句 (commit,rollback,savepoint),DDL语句.为啥⼦呢,这些特殊语句与⼀般sql语句
的最主要区别是涉及到commit的问题.所以如果触发语句只是⼀般语句的话⾃然不能因为trigger的操作带有commit这样的特性了.
创建触发器
针对表或视图的触发器格式如下:
CREATE [OR REPLACE] TRIGGER trigger_name
sql约束条件大于0{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
先来看⼀个简单的,statement级别的trigger怎么创建.假如有表tb1,每insert⼀点就通过trigger在tblog中记录⼀些信息.
create or replace trigger tb1_trigger
after insert on tb1
referencing new as new old as old
declare
v_info varchar2(100);
begin
v_info := "do a insert";
insert into tblog(info) values(v_info);
end;
trigger的创建中有个不太容易理解的内容:⼀针对row级别的trigger旧值新值问题
row级别trigger旧值新值
针对⼀个表或视图创建trigger时分为statement级别与row级别的trigger.所谓statement级别是说⼀个sql语句触发⼀次trigger,⽽如果是row级别则⼀个sql语句涉及到多⾏数据则trigger会被触发多次.
⽽旧值就是指要更改的那⼀⾏数据在被改之前的值,新值就是⽤户更新后值.假如表tt只有⼀列⼀⾏数据:88.然后⽤户执⾏语句update tt set id = 99 where id = 88;
则旧值指88,新值指99.那你们可能会问⽤什么⽅式去得到旧值或新值啊.来举例看下
假如有表tb(eno int); 和表tblog( info varchar2(100)); 假如在tb上创建trigger,tb每update⼀次则在tblog中记录旧值就更改后的新值.
CREATE OR REPLACE TRIGGER tb_trigger
BEFORE UPDATE
ON tb
REFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值.如果不指定默认值为new ,old.可以通过:new或:old去引⽤
FOR EACH ROW
DECLARE
v_info varchar2(100);
BEGIN
v_info := 'old value:' ||to_char( :) || 'new value:' || to_char(:);
insert into tblog values(v_info);
END;
条件判断
假如只有在涉及到某⼀⾏的操作时触发trigger,假如该触发器是针对updat,delete,insert都触发的情形.咋整呢,⾃然是多⽤些when去判断啊.
例如
CREATE OR REPLACE TRIGGER tb_trigger
BEFORE UPDATE or insert or delete
ON tb
REFERENCING NEW AS new_val OLD AS old_val --在这⾥设置名字,然后可引⽤新值,旧值
FOR EACH ROW
when ( = 99)
DECLARE
v_info varchar2(100);
BEGIN
case
when updating then
v_info := 'old value:' ||to_char( :) || 'new value:' || to_char(:);
insert into tblog values(v_info);
when inserting then
null;
when deleting then
null;
end case;
END;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论