完整版Oracletrigger入门
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle trigger 入门
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;
/
update 表级触发器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line('update trigger is chufale .... ');
end;
/ 可见,表级触发器在更新了多行的情况下,只触发了一次;如果在after update on student 后加上
For each row 的话就成为行级触发器,运行效果:
: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);
可以这样从数据字典中查看一个表上有哪几个触发器:
带有: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;
/
运行效果:
When 的使用:如果在begin 也就是说触发器的PL/SQL 主体块执行前加上when(old.se= ' f ') 的话,DML 操作照做不误,但是只会在删除
Se='的'那行的时候才会执行触发器的主体动作,执行效果:
混合类型触发器:
Inserting,deleting,updating 三个谓词可以分别指示当前操作到底是哪个;
create or replace trigger hunhetrigger
before insert or update or delete on student
for each row
begin
if inserting then
dbms_output.put_line('insert le ........ ');
end if;
if deleting then
dbms_output.put_line('delete le ...... ');
end if;
end;
/
注意,既然触发器内部的主体PL/SQL 是语句,那么它同样也可以是插入删除操作而不一定只是dbms_output 打印一些信息;
这正是日志表的原理:在用户执行了DML 语句的时候触发主体为插入日志表以记录操作轨
迹的触发器;
注意:触发器会使得原来的SQL 语句速度变慢;
替代触发器:
创建在视图上的触发器,就是替代触发器,只能是行级触发器;为什么要用替代触发器?
假如你有一个视图是基于多个表的字段连接查询得到的;现在如果你想直接对着这个视图
in sert;那你一定在想,我对视图的插入操作
怎么来反应到组成这个视图的各个表中呢?事实上,除了定义一个触发器来绑定在对视图上的插入动作上外,你没有别的办法通过系统的报错而直接向视图中插入数据;这就是我们用替代触发器的原因;替换的意思实际上是触发器的主体部分把对视图的插入操作转换成详细的对各个表的插入;
变异表:变异表就是当前SQL 语句正在修改的表,所以在一个变异表上绑定的触发器不可
以使用cout() 函数,原因很简单:SQL 语句刚刚修改了表,你怎么统计??
约束表:
维护:
Alter trigger …..disen使得触发器不可用;
Alter trigger ................ en开启触发器;
Oracle 的内置程序包
扩展数据库的功能;
为PL/SQL 提供对SQL 功能的访问;
创建目录:
create or replace directory filedir as 'f:\oracle'
/只是向Oralce 注册了目录,实际上并不会真的建立目录在磁盘上;操作系统的文
Oracle 无权管理和锁定
件系统;