触发器是当特定事件出现时自动执行的代码块.触发器与过程的区别在于:过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的. 触发器能够执行的功能有: 1.自动生成数据. 2.强制复杂的完整性约束条件. 3.自定义复杂的安全权限. 4.提供审计和日志记录. 5.启用复杂的业务逻辑. 触发器的类型有: 1>行级触发器.(行级触发器对DML语句影响的每个行执行一次) 实例一: --触发器 --行级触发器 create table test(sid number,sname varchar2(20));--创建一个表 create sequence seq_test;--创建序列 create or replace trigger tri_test--创建触发器 before insert or update of sid on test for each row--触发每一行 begin if inserting then select seq_test.nextval into:new.sid from dual; else raise_application_error(-20020,'不允许更新ID值!');--中断程序 end if; end; --测试,插入几条记录 insert into test values(0,'ff'); insert into test values(0,'ff'); insert into test values(0,'tt'); 输出结果如下图所示:
实例二: --创建一个触发器,无论用户插入新记录,还是修改emp表的job列,都将用户指定的job列的值转换成大写. create or replace trigger trig_job before insert or update of job on emp for each row begin if inserting then :new.job:=upper(:new.job); else :new.job:=upper(:new.job); end if; end; 2>语句级触发器.(语句级触发器对每个DML语句执行一次) 实例: create or replace trigger tri_test after insert or update or delete on test 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 trigger trig_test instead of insert or update on 表名 referencing new as n for each row declare .......... begin ........ end; 4>模式触发器. 可以在模式级的操作上建立触发器. 实例如下: create or replace trigger log_drop_obj after drop on schema begin insert into ..... end; 5>数据库级触发器. 可以创建在数据库存事件上的触发器,包括关闭,启动,服务器错误,登录等.这些事件都是实例范围的,不与特定的表或视图关联. 实例: create or replace trigger trig_name after startup on database begin ........... end;
OK,大概就这些了.
原文:http://hujing1229.blog.ccidnet.com/blog-htm-do-showone-uid-60604-type-blog-itemid-188257.html
|