触发器(trigger)
定义:触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。
Oracle 事件指的是对数据库的表进行的 insert、update 及 delete 操作或对视图进行类似的操作。
注意:
1、触发器不能接收参数
2、一张表最多可以有12个触发器
3、触发器最大为32k
4、触发器中不能使用数据库事务控制语句,并且由触发器所调用的过程或函数也不能使用数据库事务控制语句,如commit、rollback
5、触发器中不能使用Long
触发器的分类:
1、DML触发器
2、替代触发器(insteadof):由于视图有可能是由多个表进行关联而成,直接通过更新视图来更新基表是不可行的,那我们就可以通过替代触发器来工作了。
3、系统触发器:可以在ORACLE 数据库系统的事件中进行触发,如 ORACLE 系统的启动与关闭等。
触发器的组成:
1、触发事件
2、触发时间:before或after
3、触发器本身
4、触发频率:触发器内定义的动作被执行的次数。即语句级(statement)触发器和行级(row)触发器。
语句级(statement)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(row) 触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次
创建触发器的语法:
create [or replace] trigger trigger_name
{before| after } {insert| delete | update [of column [, column …]]} on [schema.] table_name
[for each row ] //for each row 选项说明触发器为行触发器
[whencondition]
begin
……;
end;
DML触发器:
create or replace trigger dml_trigger
before insert or delete or update of salary on person //salary字段改变前触发
begin
if inserting then
dbms_output.put_line(‘插入操作’);
elsif deleting then
dbms_output.put_line(‘删除操作’);
elsif updating then
dbms_output.put_line(‘更新操作’);
end if;
end;
替代(instead of)触发器:
instead of用于对视图的 DML 触发,由于视图有可能是由多个表进行联结(join)而成,因而并非是所有的联结都是可更新的
//创建视图
create or replace view dept_salary_view as
select department,sum(salary) total_salary from person group by department
//创建替代触发器
create or replace trigger inst_trigger
instead of delete on dept_salary_view for each row
begin
delete from person where department=:old.department;
end inst_trigger;
//执行删除操作,触发替代触发器
delete from dept_salary_view where department=’人事部’; //where后的字段一定要是视图中存在的
系统触发器:
语法:
create or replace trigger [sachema.]trigger_name
{before|after} {ddl_event_list | database_event_list} on { database | [schema.] schema }
[when_clause]
begin
……
end;