触发器
一.简介
触发器是由 PL/SQL 或 Java 编写的过程[procedure],当表或视图被修改或发生用户操作[user action]或数据库系统操作[database system action]时被触发运行[fire]。
当以下操作发生时,触发器[trigger]被触发运行:
· 用户提交了针对特定表或视图的 DML 语句(INSERT,UPDATE,DELETE)
· 特定的方案[schema]/用户或数据库内任意方案/用户提交了 DDL 语句(主要指 CREATE 及 ALTER)
· 特定的方案/用户或数据库内任意方案/用户提交的数据库事件[event],例如登录/退出[logon/logoff],错误[error],或启动/关闭[startup/shutdown]
触发器与存储过程[stored procedure]类似。数据库触发器内可以包含 Java 语句,或 SQL 语句及 PL/SQL 结构,也可以调用其他存储过程。触发器与存储过程的区别在于她们的调用方式不同。存储过程是由用户,应用程序或触发器显式地调用的。而触发器是在触发事件[triggering event]发生时由 Oracle 隐式地触发的,触发器的运行与连接到数据库的用户及用户使用的是何种应用程序无关。
能够导致触发器被调用的事件包括:
· 修改表数据的 DML 语句(INSERT,UPDATE,或 DELETE)
· DDL 语句
· 启动[startup],关闭[shutdown]或错误消息[error message]等系统事件[system event]
· 登录[logon]及退出[logoff]等用户事件[user
二.触发器组成:
一个触发器[trigger]包含 3 个基本组成部分:
· 触发事件[triggering event]或触发语句[triggering statement]
· 触发限制条件[trigger restriction]
· 触发操作[trigger action]
三. 触发器的类型
1、 语句触发器
2、 行触发器
3、INSTEAD OF触发
4、 系统条件触发器
5、 用户事件触发器
四. 触发器的触发次序
1.执行before级别的语句
2.对与受语句影响的每一行
Before行级/执行DML语句/执行after行级触发
3.执行after语句触发
五.注意
1.触发器不接受参数。
2.一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
3.在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
4.触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
5.在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。
6.触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
7.在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
8.在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的任何long和blob列。
9.不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别
六.DML触发器的限制
1.CREATE TRIGGER语句文本的字符长度不能超过32KB;
2.触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。
3.触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;
4.由触发器所调用的过程或函数也不能使用数据库事务控制语句;
5.触发器中不能使用LONG, LONG RAW 类型;
6.触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;
ALTER TIGGER trigger_name DISABLE | ENABLE ;可用不可用
七.两个demo及详解
----1.行触发
create or replace trigger biufer_abook_BOOKNAME ---创建
before insert or update or delete ----在ddm之前
of BOOKMADE ---列名
on abook ----表名
referencing old as old_value new as new_value
for each row ----行触发
when (new_value.bookmade <> '新华' and new_value.bookmade <> '人民')
begin
:new_value.BOOKMADE := '新华';
end;
---2.语句触发
create or replace trigger biufer_abook_after
after insert or update or delete of bookname on abook
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('删除');
elsif inserting then
dbms_output.put_line('插入');
end if;
end;
-----3.instead of触发器<视图>
create or replace biuger_view_name
instead of insert or update on view_name
referencing new as n
for each row
declare
..........
begin
........
end;
-----4.模式触发器.可以在模式级的操作上建立触发器
create or replace trigger biuger_schema
after drop on schema
begin
insert into .....
end;
------5.数据库级触发器.不与特定的表或视图关联.
create or replace trigger trig_name
after startup on database
begin
...........
end;
DML触发器的限制
1.CREATE TRIGGER语句文本的字符长度不能超过32KB;
2.触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。
3.触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;
4.由触发器所调用的过程或函数也不能使用数据库事务控制语句;
5.触发器中不能使用LONG, LONG RAW 类型;
6.触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;