oracle触发器语法及实例
一oracle触发器语法
触发器是特定事件出现的时候自动执行的代码块类似于存储过程触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的而触发器是不能被直接调用的
功能
允许/限制对表的修改
自动生成派生列比如自增字段
强制数据一致性
提供审计和日志记录
防止无效的事务处理
启用复杂的业务逻辑
触发器触发时间有两种after和before
触发器的语法
create[orreplace]tigger触发器名触发时间触发事件
on表名
[foreachrow]
begin
pl/sql语句
end
其中
触发器名触发器对象的名称
由于触发器是数据库自动执行的因此该名称只是一个名称没有实质的用途
触发时间指明触发器何时执行该值可取
before—表示在数据库动作之前触发器执行;
after—表示在数据库动作之后出发器执行
触发事件指明哪些数据库动作会触发此触发器
insert数据库插入会触发此触发器;
oracle触发器语法(二)oracle触发器详解
update数据库修改会触发此触发器;
delete数据库删除会触发此触发器
表名数据库触发器所在的表
foreachrow对表的每一行触发器执行一次如果没有这一选项则只对整个表执行一次
举例
下面的触发器在更新表auths之前触发目的是不允许在周末修改表
createtriggerauth_securebeforeinsertorupdateordelete//对整表更新前触发
onauths
begin
if(to_char(sysdatedy)=sun
raise_application_error(不能在周末修改表auths);
endif;
end
例子
createorreplacetriggercrmt_sub_userinfo_aur_nameafterupdateofstaff_name
oncrmt_sub_userinfo
referencingoldasoldnewasnew
foreachrow
declare
begin
if:newstaff_name!=:oldstaff_namethen
begin
客户投诉
updatet_plaint_managesetserve_name=:newstaff_namewhereserve_seed=:oldseed;
客户关怀
updatet_customer_caresetexecutor_name=:newstaff_namewhereexecutor_seed=:oldseed;
客户服务
updatet_customer_servicesetexecutor_name=:newstaff_name
whereexecutor_seed=:oldseed;
end;
endif;
endt_sub_userinfo_aur_name;
/
二
开始
createtriggerbiufer_employees_department_id
beforeinsertorupdateofdepartment_idonemployees
referencingoldasold_valuenewasnew_value
foreachrow
when(new_valuedepartment_id<>)
begin
:mission_pct:=;
end;
/
触发器的组成部分
触发器名称
触发语句
触发器限制
触发操作
触发器名称
createtriggerbiufer_employees_department_id
命名习惯
biufer(beforeinsertupdateforeachrow)
employees表名
department_id列名
触发语句
比如
表或视图上的dml语句
ddl语句
oracle触发器语法(四)
数据库关闭或启动startupshutdown等等
beforeinsertorupdate
ofdepartment_id
onemployees
referencingoldasold_value
newasnew_value
foreachrow
说明
无论是否规定了department_id对employees表进行insert的时候
对employees表的department_id列进行update的时候
触发器限制
when(new_valuedepartment_id<>)
限制不是必须的此例表示如果列department_id不等于的时候触发器就会执行
其中的new_value是代表更新之后的值
触发操作
是触发器的主体
begin
:mission_pct:=;
end;
主体很简单就是将更新后的mission_pct列置为
触发
insertintoemployees(employee_idlast_namefirst_namehire_datejob_idemail
department_idsalarymission_pct)
values(chendonnysysdate);
selectmission_pctfromemployeeswhereemployee_id=;
触发器不会通知用户便改变了用户的输入值oracle触发器语法(四)
数据库关闭或启动startupshutdown等等
beforeinsertorupdate
ofdepartment_id
onemployees
referencingoldasold_value
newasnew_value
foreachrow
说明
无论是否规定了department_id对employees表进行insert的时候
对employees表的department_id列进行update的时候
触发器限制
when(new_valuedepartment_id<>)
限制不是必须的此例表示如果列department_id不等于的时候触发器就会执行
其中的new_value是代表更新之后的值
触发操作
是触发器的主体
begin
:mission_pct:=;
end;
主体很简单就是将更新后的mission_pct列置为
触发
insertintoemployees(employee_idlast_namefirst_namehire_datejob_idemail
department_idsalarymission_pct)
values(chendonnysysdate);
selectmission_pctfromemployeeswhereemployee_id=;
lishixinzhi/article/program/oracle/201311/17146