触发器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按照触发方式,oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器?
DML触发器有三类:
1,insert触发器;
2,update触发器;
3,delete触发器;
触发器的组成部分:
触发器的声明,指定触发器定时,事件,表名以类型
触发器的执行,PL/SQL块或对过程的调用
触发器的限制条件,通过where子句实现
类型:
应用程序触发器,前台开发工具提供的;
数据库触发器,定义在数据库内部由某种条件引发;分为:
DML触发器;
数据库级触发器;
替代触发器;
DML触发器组件:
1,触发器定时
2,触发器事件
3,表名
4,触发器类型
5,When子句
6,触发器主体
可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例
创建DML触发器:
Create [or replace] trigger [模式.]触发器名
Before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 条件
PL/SQL块
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;
When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;
Insert触发器的创建:
create or replace trigger tg_insert
before insert on student
begin
dbms_output.put_line('insert trigger is chufa le .....');
end;
/
执行的效果:
SQL> insert into student
2 values(202,'dongqian','f');
insert trigger is chufa le .....
update表级触发器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line('update trigger is chufale .....'); end;
/
运行效果:
SQL> update student set se='f';
update trigger is chufale .....
已更新8行;
可见,表级触发器在更新了多行的情况下,只触发了一次;如果在after update on student后加上
For each row的话就成为行级触发器,运行效果:
SQL> update student set se='m';
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
已更新8行;
:new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row
这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;
使用insert的时候只有:new里有值;
使用delete的时候只有:old里有值;
使用update的时候:new和:old里都有值;
可以这样使用:dbms_output.put_line('insert trigger is chufa
dbms_output.put_line('new id is : '||:new.stui
dbms_output.put_line('new name is : '||:new.st
dbms_output.put_line('new se is : '||:new.se); 可以这样从数据字典中查看一个表上有哪几个触发器:
SQL> select trigger_name from user_triggers
2 where table_name=upper('student');
TRIGGER_NAME
------------------------------
TG_INSERT
TG_UPDATESTUDENT
带有:old变量的行级delete触发器:
create or replace trigger tg_deletestudent
before delete on student
for each row
begin
dbms_output.put_line('old is: '||:old.stuid);
dbms_output.put_line('old name: '||:old.stuname); end;
/
运行效果:
SQL> delete from student;
old is: 202
old name: dongqian
old is: 101
old name: liudehua
old is: 102
old name: lingqingxia
old is: 103
old name: lichanggong
old is: 104