pl/sql操作数据库之触发器的使用
这篇文章讲述的是pl/sql操作数据库之触发器的使用,如有错误或不当之处,还望各位大神批评指正。
什么是触发器?
- 触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
触发器的类型
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
触发器的创建
注:INSTEAD OF 选项使ORACLE激活触发器,而不执行触发事件。只能对视图和对象视图建立INSTEAD OF触发器,而不能对表、模式和数据库建立INSTEAD OF 触发器。
- 可选项:INSERT | DELETE | UPDATE [OF column [, column …]]指的是出发事件,即什么操作下激活触发器。
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{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]
trigger_body;
- 例1:创建行级触发器,在更新学生信息后打印helloworld
create or replace trigger update_std_trigger
--在什么时候触发
after update
--触发事件
on student
--触发器频率若为空则是语句级
for each row
--触发器本体
begin
dbms_output.put_line('更新学生触发器');
end ;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这样在更新学生时就会打印‘更新学生触发器’
-
old和new
当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、 后列的值,:old表示操作前的值,:new表示操作后的值
-
例2:创建触发器在更新学生,年龄加一时输出更新前的年龄和更新后的年龄
create or replace trigger update_std_trigger2
--在什么时候触发
after update
--触发事件
on student
--触发器频率若为空则是语句级
for each row
--触发器本体
begin
dbms_output.put_line('更新前年龄:'||:old.age||' 更新后年龄:'||:new.age);
end ;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
触发器的执行次序
- 执行 BEFORE语句级触发器;
- 对与受语句影响的每一行:
- 执行 BEFORE行级触发器
- 执行 DML语句
- 执行 AFTER行级触发器
- 执行 AFTER语句级触发器
删除、打开、关闭触发器
DROP TRIGGER trigger_name;
ALTER TIGGER trigger_name DISABLE;
ALTER TIGGER trigger_name ENABLE ;