- 语句体
- trigger_body;
- 构 成
- 触发器名称,触发器的触发条件等
- 中文名
- Oracle触发器
- 触发器的名称
- trigger_name
-
2022-04-25 16:19:01
create or replace trigger t_after_user_copy --create or replace trigger 触发器名称 after insert or update or delete ---时间 after/before 事件 insert or update or delete on t_user ---作用的表 on tablename FOR EACH ROW -- 指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器 BEGIN IF INSERTING THEN insert into t_user_copy(ID,NAME) values(:NEW.ID,:NEW.NAME); ELSIF UPDATING THEN UPDATE t_user_copy SET NAME = :NEW.NAME WHERE ID = :OLD.ID; ELSIF DELETING THEN DELETE FROM t_user_copy WHERE ID = :OLD.ID; END IF; END; 相关参数注解: before和after:指在事件发生之前或之后激活触发器。 insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。 referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD。 for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器
更多相关内容 -
Oracle触发器用法实例详解
2020-12-16 01:13:34本文实例讲述了Oracle触发器用法。分享给大家供大家参考,具体如下: 一、触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。... -
Oracle触发器备份表数据
2020-12-14 23:38:491.通过行触发器备份表数据 – 创建备份表,首次将数据全部备份 create table emp2_bak as select * from emp2; – 给备份表增加备份时间和是否被删除字段(1为删除) alter table emp2_bak add bakTime ... -
Oracle触发器表发生了变化 触发器不能读它的解决方法(必看)
2020-09-09 18:01:28下面小编就为大家带来一篇Oracle触发器表发生了变化 触发器不能读它的解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
Oracle触发器
2020-12-14 16:37:08Oracle触发器 –今天我们根据学到的东西实现一个id列自动增长的触发器 –首先我们需要建个表,主键id,name不为空 create table student( id number primary key, name varchar2(50) not null ) –查一下看看 select... -
oracle触发器
2021-05-06 02:45:33oracle触发器系统默认用户浏览 4438oracle触发器怎么写?通过编写数据库触发器,在HR数据库上实现下面的业务规则:1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长...通过编写数据库触发器,在HR...oracle触发器
系统默认用户
浏览 4438
oracle触发器怎么写?
通过编写数据库触发器,在HR数据库上实现下面的业务规则:1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长...
通过编写数据库触发器,在HR数据库上实现下面的业务规则:
1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长
推荐于2019-06-04 21:52:46
创建触发器,给触发器命名,在哪个表上的增删改进行触发,是否为行级触发
编写你的逻辑
编译检查是否有语法错误啥的
测试,这里的话,就是你某一个工种的最低工资增加,那属于这个工种的员工中原来是最低工资的也要增加,所以你要先把工种中最低工资查出来,根据工种号,查询属于该工种的人有哪些,把这些员工的工资查出来,再修改工种的最低工资,再查员工工资是否也增加了。
你这表也没有,我门也没有办法给你写一个很详细的。大致思路一般是这样
26905人赞同了该观点
系统默认用户
浏览 1933
ORACLE更新触发器的写法
我想写一个触发器,当BILL表中的status字段为50时,使得ACCOUNT字段更新为Y,请指导,谢谢!status字段的值是由其它值更新为50的...
我想写一个触发器,当BILL表中的status字段为50时,使得ACCOUNT字段更新为Y,请指导,谢谢!
status字段的值是由其它值更新为50的
推荐于2019-06-04 21:52:46
创建测试表:create table bill
(id int,
status int,
aacount varchar2(1));
一条测试数据:insert into bill values (1,49,'N');
commit;
创建触发器:create or replace trigger t_update_bill
before insert or update on bill
for each row
begin
if :new.status=50
then :new.aacount:='Y';
end if;
end;
测试1:
将id=1那条数据的status改成50,然后检查结果(请自行测试,我这边验证无误了):update bill set status=50 where id=1;
commit;
测试2:
插入一条id=2,status为50,account为N的数据(请自行测试,我这边验证无误了):insert into bill values (2,50,'N');
commit;
30014人赞同了该观点
系统默认用户
浏览 6660
Oracle数据库触发器问题
有Oracle数据库有两个一样表结构的表A,B,现在想写触发器实现当把多条数据同时导入表A时先清空原来表A里面的所有数据,并把新导入的数据同步到表B中去。现在我的触发器是这样写的crea...
有Oracle数据库有两个一样表结构的表A,B,现在想写触发器实现当把多条数据同时导入表A时先清空原来表A里面的所有数据,并把新导入的数据同步到表B中去。
现在我的触发器是这样写的
create or replace trigger A_trigger
before insert on A for each row
begin
insert into
B(id,num,name)VALUES(:new.id,:new.num,:new.name);
delete from A;
end ;
得出的结果是能把数据成功同步到B表中去,但是A表中只有导入的多数据中最后面的一条数据,这个要怎么改进才行?求教各位大神!谢谢
现在主要的问题是A导入多条数据时只剩下最后一条数据,这不是我想要的结果,我想要的是导入多条数据时表A里面的数据删除,新导入的全部保留。
展开
推荐于2019-06-04 21:52:46
你怎么界定哪些是新导入的呢?因为你说每次导入都把旧数据删除,你这次导入数据之后,对于下一次导入,你上一次的就是旧数据,所以应该删除也是没错的。
然后你这样写因为你的delete from a;是写在触发器里面,每导入一次 都会触发一次,所以A表每次都只会保留一条数据。
我有个建议就是把每天最新一天的数据当做新数据,这样你在触发器删除的时候可以加个日期判断,如果是当天的数据 就不删除,delete from a where date<>'今天日期'
5193人赞同了该观点
系统默认用户
浏览 2006
oracle触发器无效且未通过验证
BEGINtmpVar:=0;SELECTironout_seq.NEXTVALINTOtmpVarFROMdual;:NEW.Sequence_id:=tmpVar;EXCEPTIONWHENOTHERSTHEN--Considerloggingtheerrorandthenre-raiseRAISE;insertintoIRONOUT...
BEGIN
tmpVar := 0;
SELECT ironout_seq.NEXTVAL INTO tmpVar FROM dual;
:NEW.Sequence_id := tmpVar;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
insert into IRONOUT@LADLETRACK61 (SEQUENCE_ID,TRAIN_ID,IRONOUT_STARTTIME,IRONOUT_ENDTIME,FLAGE,PORT,WEIGHT,CREATER,TAREWET,GROSSWET,JLCH,NETWET)
VALUES(:new.SEQUENCE_ID,:new.TRAIN_ID,:new.IRONOUT_STARTTIME,:new.IRONOUT_ENDTIME,:new.FLAGE,:new.PORT,:new.WEIGHT,:new.CREATER,:new.TAREWET,:new.GROSSWET,:new.JLCH,:new.NETWET);
END ;
展开
推荐于2019-06-04 21:52:46
31506人赞同了该观点
系统默认用户
浏览 6094
关于oracle触发器,根据条件插入并赋值的问题
比如现有一张表A,里面有id,name,phone,type(type值会有1,2,3),applytype(值会有11,12)和result5个字段。然后我现在需要创建一个触发器实时将数据插入到B表(插入B表的字段除了pho...
比如现有一张表A,里面有id,name,phone,type(type值会有1,2,3), applytype(值会有11,12)和result5个字段。然后我现在需要创建一个触发器实时将数据插入到 B表(插入B表的字段除了phone以外的字段),只要A表有一行数据就同步到B表,并且A表不会手动修改数据,同步条件是type为2且applytypoe=11时,再插入B表,并且将B表的result字段值设定为"Y"。
本人对触发器小白,请大神尽量详细的解答,谢谢!
展开
推荐于2019-06-04 21:52:46
6620人赞同了该观点
系统默认用户
浏览 7598
arcgis有没有类似oracle触发器的工具
就是当我删除或者增加一个要素时,数据库自己会备份一个相同的要素在另一个要素集里...
就是当我删除或者增加一个要素时,数据库自己会备份一个相同的要素在另一个要素集里
推荐于2019-06-04 21:52:46
oracle中触发器有三种
1.DML触发器
ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
2 .替代触发器
由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。
3. 系统触发器
ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
16939人赞同了该观点
系统默认用户
浏览 18
oracle 触发器修改数据问题
createorreplacetriggermodify_gradebeforeupdateonscforeachrowbeginif:new.grade<:old.gradethenraise_application_error>
create or replace trigger modify_gradebefore update on scfor each rowbeginif :new.grade<:old.grade thenraise_application_error if>
展开
推荐于2019-06-04 21:52:46
楼主你好:
每个触发器都会有自己的作用,而你上面触发器写的规则就是,当你对表scfor 中的grade列在更新(update)的时候,如果更新的值小于原先的值的时候,就会触发你自定义的异常错误代码信息。
所以,当你更新scfor.grade列值,对其进行赋值小的数值的时候,就会出现你上面的自定义错误信息报错,这也就是你这个触发器的作用。
24278人赞同了该观点
系统默认用户
浏览 5456
Oracle 创建触发器报错 pls-00103
各位大神好,小女因工作需要学习oracle,今天在学到创建触发器时,一直报错,请各位大神帮忙看一下,怎么修改。万分感谢!!!这是我建的account表的代码:CREATETABLEaccount(acct_n...
各位大神好,小女因工作需要学习oracle,今天在学到创建触发器时,一直报错,请各位大神帮忙看一下,怎么修改。万分感谢!!!这是我建的account表的代码:CREATE TABLE account (acct_num NUMBER(6), amount NUMBER(10,2));这是我建的触发器的要求,:要求:创建一个名为INS_SUM的触发器,触发的条件是向数据表account插入数据之前,输出提示信息。触发器代码:CREATE OR REPLACE TRIGGER INS_SUMBEFORE INSERTON accountBEGINIF INSERT THENDBMS_OUTPUT.PUT_LINE('下面将开始插入数据');END IF;END;执行触发器代码后,报错:错误:PLS-00103: 出现符号 "INSERT"在需要下列之一时: ( - + case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date pipe purge json_exis行:5文本:IF INSERT THEN请各位大神看一下,到底哪里错了,怎么修改。谢谢各位大神!!!
展开
推荐于2019-06-04 21:52:46
29276人赞同了该观点
系统默认用户
浏览 5411
Oracle 触发器和存储过程需要单独备份吗?
推荐于2019-06-04 21:52:46
看你具体需求了。无论是触发器还是存储过程,都是数据库的一个对象,所以你可以备份在一起,也可以分开。都可以的。
20347人赞同了该观点
系统默认用户
浏览 1040
oracle 怎么在执行查询语句的时候触发触发器?如果不能有办法实现相同的功能吗?
推荐于2019-06-04 21:52:46
查询的时候在程序里调用存储过程不是一样的么。
我们这里都已经禁止使用触发器、存储过程了,出了问题排查太困难,不知道是程序的问题还是DB那边的问题,找的头大。
所有逻辑放到程序那边。
16383人赞同了该观点
-
oracle 触发器实时调用java 中http接口
2019-08-17 17:17:23oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http -
Oracle触发器里调用Java程序
2019-07-28 01:17:46NULL 博文链接:https://softwarexiang120.iteye.com/blog/773557 -
Oracle触发器trigger详解
2020-09-09 23:53:30主要为大家详细介绍了Oracle触发器trigger,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Oracle 触发器
2021-05-06 02:46:53Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。一、触发器的作用Oracle触发器可以根据不同的...Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。
一、触发器的作用
Oracle触发器可以根据不同的数据库事件进行特定的调用触发器程序块,因此,它可以帮助开发者完成一些PL/SQL存储过程完成不了的问题,比如操作日志的记录、防止一些无效的操作、校验数据的正确性、限制一些对数据库对象的操作、提供数据同步的可行性。但是不推荐在触发器当中写业务逻辑程序,因为这样对后期数据的维护将大大提高成本。
二、触发器的类型
触发器按照用户具体的操作事件的类型,可以分为5种触发器。大致如下:
1、数据操作(DML)触发器:此触发器是定义在Oracle表上的,当对表执行insert、update、delete操作时可以触发该触发器。如果按照对表中行级数据进行触发或语句级触发,又可以分为行级(row)触发器,语句级触发器,按照修改数据的前后触发触发器,又可以分为 after 触发器和before触发器之分。
2、数据定义操作(DDL)触发器:当对数据库对象进行create、alter、drop操作时,触发触发器进行一些操作记录保存、或者限定操作。
3、用户和系统事件触发器:该类型的触发器是作用在Oracle数据库系统上,当进行数据库事件时,触发触发器,一般用来记录登录的相关信息。
4、INSTEAD OF 触发器:此类型的触发器是作用在视图上,当用户对视图进行操作时,触发该触发器把相关的操作转换为对表进行操作。
5、复合触发器:指的是对数据操作(DML)触发器当中的多种类型触发器进行复合,比如;一个触发器当中包含着after(或before)的行级触发器和after(或before)的语句级触发器,来完成一些更为复杂的操作。
案例1、创建一个简单的触发器来校验学生基本信息的正确性,代码如下:create or replace trigger tr_xsjbxx_insert
before insert on stuinfo
for each row
begin
--对性别的数据进行校验
if :new.SEX not in ('1', '2') then
raise_application_error(-20001, '性别错误,请正确选择。');
end if;
end;
insert into STUINFO
(STUID,
STUNAME,
SEX,
AGE,
CLASSNO,
STUADDRESS,
GRADE,
ENROLDATE,
IDNUMBER)
values
('SC201801006',
'张三丰',
'3',
26,
'C201801',
'福建省厦门市XXX号',
'2018',
to_date('01-09-2018', 'dd-mm-yyyy'),
'3503021992XXXXXXXX');
结果如下:
代码解析:这是一个DML触发器,是对学生信息表(stuinfo)学生数据插入(insert)之前做的一个性别的校验,当性别的值不符合规范的时候报数据错误。
三、DML类型触发器
Oracle DML类型触发器是Oracle开发过程当中最经常用到,也是最常见的触发器,主要是对DML操作,如:insert、delete、update操作事件进行触发。
DML类型触发器安装触发的事件的前后和数据触发的类型可以分为四类:前置行级触发器、后置行级触发器、前置语句级触发器、后置语句级触发器。
创建DML类型触发器的语法结构如下:create [ or replace] trigger tr_name(触发器名)
before|after
delete| insert | update [of column1,column2...]
[or delete |insert| update of colum1,colum2...]
on table_name(表名)
[for each row]
[follows tr_name1(其它触发器名)]
[when 条件]
declare
--声明部分
begin
--触发器内容部分
end;
语法解析:
1、or replace :存在同名的触发器就覆盖保存。
2、trigger:创建触发器的关键词。
3、before|after表示是选择的触发器是数据改变之前触发、数据改变之后触发。
4、delete| insert | update:表示触发器触发的事件类型是删除、插入或更新。
5、for each row: 表示行级触发器、不填就是语句级触发器
6、follows :表示触发器的顺序是跟在哪个之后。
7、when 表示触发器语句触发的条件
行级触发器
行级触发器一般用来做数据的校验或者记录数据的操作日志,下面是一个行级触发器的例子:
案例1、利用行级触发器记录更新学生信息表时的操作记录,代码如下:create or replace trigger tr_stuinfo_update
before update on stuinfo
for each row
begin
--当学生班号发生变化时,
if :new.CLASSNO <> :old.CLASSNO then
--插入操作日志表
insert into oplog
(LOGID, --日志ID
TABLENAME, --表名
COLNAME, --列名
NEWDATA, --改变后数据
OLDDATA, --改变前数据
OPDATE, --操作时间
OPERATOR) --操作人
values
(pk_oplog_id.nextval,
'stuinfo',
'classno',
:new.classno,
:old.classno,
sysdate,
'jsq');
end if;
end;
代码解析:
1、这是一个学生信息表(stuinfo)update的前置行级触发器,当修改学生的班号时,会把修改的记录的操作信息记录在日志表(oplog)中。
2、行级触发器通过:new和:old来访问变化之后的数据和变化之前的数据,update类型触发器,新旧数据都可以访问,delete类型触发器,只能访问:old值,insert类型触发器只能访问:new值。
建立好触发器,我们更改一条数据看下效果,代码如下:update stuinfo t set t.classno = 'C201802' where t.stuid = 'SC201801006';
select * from oplog;
结果如下:
语句级触发器
语句级触发器一般是用来做特定限制语句操作的作用,比如在某一段时间内禁止某一部分语句操作,下面是一个语句级触发器的案例:
案例2、比如今天是12月15号,我就禁止每月的15号禁止操作学生信息表(stuinfo)的插入和删除或修改操作。代码如下:create or replace trigger tr_stuinfo_sql
before update or insert or delete on stuinfo
begin
--每月15号禁止操作学生信息表
if to_char(sysdate,'dd')='15' then
raise_application_error(-20001,'每月15号不能对学生信息表进行正删改操作!');
end if;
end;
代码解析:
1、DML语句触发器就是行级触发器省略掉for each row的写法。
2、raise_application_error是主动给客户端抛出-20001代码错误的信息。
建立好触发器,我们更新一条数据看下效果,结果如下:
总结:
同一个对象上可以有多个DML触发器,但是触发器触发的时候有先后顺序,比如before型触发器比after型触发器先触发,在此基础上行级触发器,比语句级触发器更早触发。同类型的触发器的先后顺序就按follows关键词+触发器名进行排序。
四、DDL类型触发器
Oracle DDL类型触发器主要是对于Oracle数据库的DDL操作触发的触发器,主要包括create、drop、alter等DDL事件,经常利用DDL类型触发器记录DDL操作记录或者限定对某个对象进行DDL操作。也可以根据对应DDL操作做对应的操作。
Oracle DDL类型触发器的语法结构
DDL类型触发器的编写语法如下:create [ or replace] trigger tr_name(触发器名)
before|after
ddl_event|database_event
on SCHEMA(数据库对象)|DATABASE(数据库)
[follows tr_name1(其它触发器名)]
[when 条件]
declare
--声明部分
begin
--触发器内容部分
end;
语法解析:
1、or replace :存在同名的触发器就覆盖保存。
2、trigger:创建触发器的关键词。
3、before|after表示是选择的触发器是在进行DDL操作之前触发还是之后触发。
4、ddl_event:表示的DDL事件,有create(创建)、alter(修改)、drop(删除)等常用DDL操作。
5、SCHEMA|DATABASE:表示触发器是作用在数据库对象上还是数据库上。
6、follows :表示触发器的顺序是跟在哪个之后。
7、when 表示触发器触发的附带条件,比如时间。
下面通过一个案例来解析Oracle DDL类型触发器的写法:
案例1、利用Oracle DDL类型触发器给学生信息表(stuinfo)做一个禁止删除、修改表结构的触发器,代码如下:create or replace trigger tr_stuinfo_ddl
before alter or drop on schema
begin
--禁止对学生信息表进行删除和修改操作
if dictionary_obj_name = 'STUINFO' THEN
--修改表结构
if sysevent = 'ALTER' then
--抛出错误
raise_application_error(-20001,
'禁止学生信息表stuinfo进行alter操作!');
end if;
--删除表结构
if sysevent = 'DROP' then
--抛出错误
raise_application_error(-20001,
'禁止学生信息表stuinfo进行drop操作!');
end if;
END IF;
end;
执行完案例1触发器,我们通过修改学生信息表(stuinfo)测试一下触发器的效果,代码如下:--修改表结构
alter table STUINFO modify stuaddress VARCHAR2(200);
--删除表结构
drop table stuinfo;
结果如下:
案例2、利用DDL类型触发器的创建一个数据库级别的触发器,记录用户登录数据库的记录信息。再次我们需要设计一个登录记录表,来保存用户登录信息,代码如下:-- Create table
create table LOGIN_LOG
(
logid VARCHAR2(20),
loginuser VARCHAR2(100),
logindate DATE
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table LOGIN_LOG
is '登录日志表';
-- Add comments to the columns
comment on column LOGIN_LOG.logid
is '日志id';
comment on column LOGIN_LOG.loginuser
is '登录用户名';
comment on column LOGIN_LOG.logindate
is '登入时间';
建立DDL类型触发器(数据库级):create or replace trigger tr_stuinfo_ddl_login
after logon--数据库系统事件
on database
begin
--插入登录日志表
insert into login_log
(LOGID, LOGINUSER, LOGINDATE)
values
(pk_oplog_id.nextval,sys.login_user, sysdate);
end;
建立好案例2触发器,我们通过登录数据库,然后查看下登录日志表,查看一下效果,结果如下:
转载本站内容时,请务必注明来自W3xue,违者必究。
-
Oracle触发器实例代码
2020-09-09 17:48:10Oracle触发器,用于选单后修改选单的表的触发动作。接下来通过本文给大家分享Oracle触发器实例代码,需要的的朋友参考下吧 -
oracle 触发器 实现出入库
2020-09-11 08:54:31出库入库这样的功能在许多系统中都有。可能叫法不一。有的可能是数量,有的可能是金额。我这里以金额为例实现出库入库也有许多方法,一种是用语言实现,一种是用触发器实现。它们各有千秋。 -
oracle异常及触发器x_oracle触发器怎么设置
2020-06-11 01:34:33oracle 异常及触发器;异常处理;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭... -
oracle触发器使用
2021-05-04 06:29:30创建在表上,由DML事件引发2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为...2)触发器分类:
1.DML触发器: 创建在表上,由DML事件引发
2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)
3.DDL触发器: 触发事件时数据库对象的创建和修改
4.数据库事件触发器:定义在数据库或者模式上,由数据库事件触发
3)组成:
1.触发事件:引发触发器被触发的事件 DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
2.触发时间:即该触发器是在触发事件发生之前(BEFORE)还是之后(AFTER)触发
3.触发操作:触发器触发后要完成的事情
4.触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,触发器才会执行触发操作。
5.触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发操作。
6.触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。(比如delete多条数据时,行级触发器可能会执行多次,语句级触发器只会触发一次)
2.语法
1)说明
不同类型的触发器例如DML触发器,Instead of触发器,系统触发器语法格式区别较大
2)一般语法
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
ON表名/视图名
[FOR EACH ROW] //加上FOR EACH ROW 即为行级触发器,不加时为语句级触发器
BEGIN
pl/sql语句
END
create [or replace] trigger [schema.]trigger_name
{before | after | instead of}
{delete [or insert][or update [of column,...n]]}
on [schema.]table_name | view_name
[for each row [when(condition)]]
sql_statement[,...n]
例如:
CREATE OR REPLACE TRIGGER trigger_name
< before | after | instead of > < insert | update | delete> ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
END;
3)instead of 触发器语法
语法:
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT|DELETE|UPDATE [OF COLUMN...]}
[OR {INSERT| DELETE| UPDATE [OF COLUMN...]}]
ON VIEW_NAME
[REFFERENCING{OLD [AS] OLD | NEW [AS] NEW| PARENT AS PARENT}] // 可以指定相关名称,当前的默认相关名称为OLD和NEW,
[FOR EACH ROW] //instead of 触发器只能在行级上触发,因为没有必要指定
[WHEN CONDITION]
DECLARE
BEGIN
END;
说明:INSTEAD OF 用于对视图的DML触发,由于视图可能有多个表进行联结而成,因而并非所有的联结均可更新,运用 INSTEAD OF 触发器可完成相应的操作。
3.实例
创建测试表格:
CREATE TABLE "HNZC"."TRIGGERTEST"
(
"ID" VARCHAR2(20 BYTE),
"NAME" VARCHAR2(20 BYTE),
"SCORE" NUMBER
);
create table tab1 select * from triggertest;
1)DML触发器/行级触发器
触发器如下:
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT ON TRIGGERTEST //插入后触发
FOR EACH ROW //行级触发器
BEGIN
INSERT INTO tab1(ID,NAME) VALUES(‘22‘,‘33‘);
END;
执行语句:
insert into triggertest (id) values (‘aabbcc‘);
语句执行结束,表tab1中新增加一条数据
2)限制对表的修改(例如非工作时间不能修改某些表)
触发器如下:
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT ON TRIGGERTEST
FOR EACH ROW
BEGIN
IF(TO_CHAR(SYSDATE,‘DAY‘) IN (‘星期三‘,‘星期天‘))
THEN RAISE_APPLICATION_ERROR(-20001,‘不是上班时间,不能修改表格triggertest‘);
END IF;
END;
执行语句:
insert into triggertest (id) values (‘aabbcc‘);
今天周三因而输出结果为:
在行 1 上开始执行命令时出错:
insert into triggertest (id) values (‘aabbcc‘)
错误报告:
SQL 错误: ORA-20001: 不是上班时间,不能修改表格triggertest
ORA-06512: 在 "HNZC.TRIGGER1", line 3
ORA-04088: 触发器 ‘HNZC.TRIGGER1‘ 执行过程中出错
通常对表的修改限制如下(即周一至周五9——18点能修改表格)
CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST
FOR EACH ROW
BEGIN
IF(TO_CHAR(SYSDATE,‘DAY‘) IN (‘星期六‘,‘星期天‘))
OR(TO_CHAR(SYSDATE,‘HH24:MI‘) NOT BETWEEN ‘9:00‘ AND ‘18:00‘)
THEN RAISE_APPLICATION_ERROR(-20001,‘不是上班时间,不能修改表格triggertest‘);
END IF;
END;
3)增加限制条件(如不能更改某个员工的记录)
触发器如下:(如下实现月儿的分数只能增加)
CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST
FOR EACH ROW
WHEN(OLD.NAME=‘月儿‘)
BEGIN
CASE WHEN UPDATING(‘SCORE‘) THEN
IF:NEW.SCORE<:old.score>
THEN RAISE_APPLICATION_ERROR(-20001,‘月儿的分数只能提升不能下降‘);
END IF;
END CASE;
END;
当前月儿的分数为20
当修改为10时出错
UPDATE "HNZC"."TRIGGERTEST" SET SCORE = ‘10‘ WHERE ROWID = ‘AAAdEzAAPAAAAH+AAB‘ AND ORA_ROWSCN = ‘47685303‘
ORA-20001: 月儿的分数只能提升不能下降
ORA-06512: 在 "HNZC.TRIGGER1", line 4
ORA-04088: 触发器 ‘HNZC.TRIGGER1‘ 执行过程中出错
当修改为30时成功
UPDATE "HNZC"."TRIGGERTEST" SET SCORE = ‘30‘ WHERE ROWID = ‘AAAdEzAAPAAAAH+AAB‘ AND ORA_ROWSCN = ‘47685303‘
提交成功
4)在触发器中调用存储过程
触发器为:
CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST
FOR EACH ROW
BEGIN
TESTPRO1();
END;
存储过程为:
create or replace
PROCEDURE TESTPRO1 AS
BEGIN
insert into tab1(id,name,score) VALUES(‘AAA‘,‘BBB‘,200);
END TESTPRO1;
执行完毕后tab1中增加一条数据
5)级联更新
触发器如下(triggertest表中name修改时同时修改tab1中的name)
create or replace
PROCEDURE TESTPRO1 AS
BEGIN
insert into tab1(id,name,score) VALUES(‘AAA‘,‘BBB‘,200);
END TESTPRO1;
执行语句:
update triggertest set name= ‘水儿‘ where name=‘月儿‘;
结果:tab1中name为月儿的也更改为水儿
6)instead of触发器
TABLE STUDENT表格数据如下
创建视图student_view
CREATE OR REPLACE VIEW STUDNET_VIEW
AS SELECT CLASSID,AVG(SCORE) AVERAGE_SCORE FROM STUDENT
GROUP BY CLASSID;
视图数据如下:
对视图student_view 执行如下操作:
DELETE FROM STUDNET_VIEW WHERE CLASSID=‘111‘;
执行结果:
错误报告:
SQL 错误: ORA-01732: 此视图的数据操纵操作非法
01732. 00000 - "data manipulation operation not legal on this view"
解决方法:创建INSTEAD OF 视图
CREATE OR REPLACE TRIGGER STUDENT_VIEW_DELETE
INSTEAD OF DELETE ON STUDNET_VIEW
FOR EACH ROW
BEGIN
DELETE FROM STUDENT WHERE CLASSID=:OLD.CLASSID;
END STUDENT_VIEW_DELETE;
执行删除语句
DELETE FROM STUDNET_VIEW WHERE CLASSID=‘111‘;
执行结果:删除成功
1 行已删除。
4.注意事项
1) 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)
2) 触发器中不能使用commit语句,触发器的操作与触发事件(INSERT,UPDATE,DELETE)一起进行COMMIT和ROLLBACK;
3) 一个表上的触发器越多,对于表的DML操作性能影响越大
4) 触发器最大为32K
oracle触发器使用
标签:scn values 系统触发器 级联 工作 分享 llb 多次 ror
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:http://www.cnblogs.com/sunziying/p/7190278.html
-
Oracle 触发器语法及实例
2021-05-07 00:34:27Oracle 触发器语法及实例Oracle触发器语法(一)一 Oracle触发器语法触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不... -
Oracle笔记之Oracle触发器
2021-11-18 20:41:22Oracle触发器 概述 本篇博文中主要探讨以下内容: 为什么要使用触发器? DML触发器(insert、update、delete等操作之前或者之后触发的事件) 系统事件触发器(系统事件和用户事件) 替代触发器(instead of) 设置触发器... -
Oracle触发器的使用
2021-05-04 06:29:42Oracle触发器的使用触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracle8i之前,只允许基于表或视图的DML操作(insert,update,delete)建立触发器,在oracle8i之后,不仅支持DML操作,也允许基于系统事件... -
ORACLE触发器类型
2021-05-05 03:32:18ORACLE触发器类型1.DML触发器由对表的INSERT,DELETE,UPDATE激发CREATE OR REPLACE TRIGGER trigger_nameAFTER -- TIMING :BEFORE OR AFTERDELETE OR INSERT OR UPDATE ON table_name -- STATEM... -
oracle触发器加条件判断、dblink
2021-05-07 12:23:20oracle触发器加条件判断 oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ... mysql left join中on后加条件判断和where中加... -
oracle触发器加载java文件访问webservice
2015-10-22 11:09:29oracle10g数据库触发器加载java文件访问webservice,里面包含详细的说明文档,完整的测试代码以及所需要的jar包等。