用途: 可以用来自动生成日志表记录 ,自动生成主键id sequence
基本语法 :
create [or replace] trigger tri_name
[before | after | instead of ] tri_event
on table_name | view_name |user_name |db_name
[for each row][when tri_condition]
begin
plsql_sentences
eg1:
trigger:触发器的关键字
[before | after | instead of ]:before 在dml操作之前完成 after 在dml操作之后完成 instead of 表示触发器为替代触发器
on :要操作的对象 表视图 用户模式 数据库等
for each row :当dml语句对每一行操作时引起触发器运行 如果未指定 则表示创建语句级触发器无论数据库操作多少行
触发器 只会执行一次
tri_name: 自定义的触发器名字
or replace 替换
tri_evvent:触发的事件 比如常用的insert update delete create alter drop
table_name | view_name | user_name |db_name:分别表示操作的数据表、视图、用户模式和数据库,对它们的某些操作将引起触发器的运行。
tri_condition:表示触发器条件表达式,只有当该表达式的值为true时,遇到触发事件才会自动执行触发器,使其执行触发操作,否则即便是遇到触发事件也不会执行触发器。
plsql_sentences:PL/SQL语句,它是触发器功能实现的主体。
Oracle所支持的触发器分为以下5类:
行级触发器:当DML语句对每一行数据进行操作时都会引起该触发器的运行。
语句级触发器:无论DML语句影响多少行数据,其所引起的触发器仅执行一次。
替换触发器:该触发器是定义在视图上的,而不是定义在表上,它是用来替换所使用实际语句的触发器。
用户事件触发器:是指与DDL操作或用户登录、退出数据库等事件相关的触发器。如,用户登录到数据库或使用ALTER语句修改表结构等。
系统事件触发器:是指在Oracle数据库系统的事件中进行触发的触发器,如Oracle实例的启动与关闭。
1,语句级触发器,是针对一条DML语句而引起的触发器执行。在语句级触发器中,不使用for each row子句,也就是说无论数据操作影响多少行,触发器都只会执行一次。
eg1:两张表: emp(eid,ename,esal) emp_log(操作类型,操作时间); 效果:当对 emp表进行 增加 删除 修改操作的
create or replace trigger tri_emp
before insert or update or delete
on emp
declare
var_tar varchar2(10);
begin
if inserting then
var_tar:='插入';
elsif updating then
var_tar:='修改';
elsif deleting then
var_tar:='删除';
end if;
insert into emp_log values(var_tar,sysdate);
end tri_emp;
2,行级触发器会针对DML操作所影响的每一行数据都执行一次触发器。创建这种触发器时,必须在语法中使用for each row。使用行级触发器的一个典型应用就是给数据表生成主键值
--行级触发器
create or replace trigger tri_insert_good
before insert on goods for each row
begin
select seq_id.nextval into :new.id from dual;
end;
3,替换触发器 替换触发器-instead of触发器,它的“触发时机”关键字是instead of,而不是before或after。
与其他类型触发器不同是,替换触发器定义在视图(一种数据库对象),而不是定义在表上。
create or replace trigger tri_insert_view
instead of insert
on view_emp_dept
for each row
declare
row_dept dept%rowtype;
begin
select * into row_dept from dept where deptno=:new.deptno;
if sql%notfound then
insert into dept(deptno,dname)values(:new.deptno,:new.dname);
end if;
insert into emp(empno,ename,deptno,job,hiredate)
values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);
end tri_insert_view;
4,用户事件触发器是因进行DDL操作或用户登录、退出等操作而引起运行的触发器,引起该类型触发器运行的
常见用户事件包括:CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、RENAME、TRUNCATE、SUSPEND、LOGON和LOGOFF等。
--用户触发器
create or replace trigger tri_ddl_oper
before create or alter or drop on scott.schema
begin
insert into ddl_oper_log values(
ora_dict_obj_name,
ora_dict_obj_type,
ora_sysevent,
ora_login_user,
sysdate
);
end;
create table ddl_oper_log
(
db_obj_name varchar2(20)
,db_obj_type varchar2(20)
,oper_action varchar2(20)
,oper_user varchar2(20)
,oper_date date
);
select * from ddl_oper_log;
create table cyll
(
id number,
childens varchar2(30),
sSal varchar2(20)
);
create view view_cyll as select * from cyll;
alter table cyll add(sAge number);
drop view view_cyll;