数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle触发器语法及实例


发布日期:2020年01月11日
 
Oracle触发器语法及实例

一 Oracle触发器语法

触发器是特定事件出现的时候自动执行的代码块类似于存储过程触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的而触发器是不能被直接调用的

功能

允许/限制对表的修改

自动生成派生列比如自增字段

强制数据一致性

提供审计和日志记录

防止无效的事务处理

启用复杂的业务逻辑

触发器触发时间有两种after和before

触发器的语法

CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

ON表名

[FOR EACH ROW]

BEGIN

pl/sql语句

END

其中

触发器名触发器对象的名称

由于触发器是数据库自动执行的因此该名称只是一个名称没有实质的用途

触发时间指明触发器何时执行该值可取

before—表示在数据库动作之前触发器执行;

after—表示在数据库动作之后出发器执行

触发事件指明哪些数据库动作会触发此触发器

insert数据库插入会触发此触发器;

Oracle触发器语法(二)Oracle触发器详解

update数据库修改会触发此触发器;

delete数据库删除会触发此触发器

表 名数据库触发器所在的表

for each row对表的每一行触发器执行一次如果没有这一选项则只对整个表执行一次

举例

下面的触发器在更新表auths之前触发目的是不允许在周末修改表

create triggerauth_secure before insert or update or delete //对整表更新前触发

on auths

begin

if(to_char(sysdateDY)=SUN

RAISE_APPLICATION_ERROR(不能在周末修改表auths);

end if;

end

例子

CREATE OR REPLACE TRIGGER CRMT_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME

ON CRMT_SUB_USERINFO

REFERENCING OLD AS OLD NEW AS NEW

FOR EACH ROW

declare

begin

if :NEWSTAFF_NAME!=:OLDSTAFF_NAME then

begin

客户投诉

update T_COMPLAINT_MANAGE set SERVE_NAME=:NEWSTAFF_NAME where SERVE_SEED=:OLDSEED;

客户关怀

update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEWSTAFF_NAME where EXECUTOR_SEED=:OLDSEED;

客户服务

update T_CUSTOMER_SERVICE set EXECUTOR_NAME=:NEWSTAFF_NAME

where EXECUTOR_SEED=:OLDSEED;

end;

end if;

end T_sub_userinfo_aur_name;

/

开始

create triggerbiufer_employees_department_id

beforeinsertorupdateofdepartment_idonemployees

referencingoldasold_value newasnew_value

for each row

when (new_valuedepartment_id<> )

begin

:mission_pct :=;

end;

/

触发器的组成部分

触发器名称

触发语句

触发器限制

触发操作

触发器名称

create trigger biufer_employees_department_id

命名习惯

biufer(before insert update for each row)

employees表名

department_id列名

触发语句

比如

表或视图上的DML语句

DDL语句

Oracle触发器语法(四)

数据库关闭或启动startup shutdown等等

before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

说明

无论是否规定了department_id对employees表进行insert的时候

对employees表的department_id列进行update的时候

触发器限制

when (new_valuedepartment_id<> )

限制不是必须的此例表示如果列department_id不等于的时候触发器就会执行

其中的new_value是代表更新之后的值

触发操作

是触发器的主体

begin

:mission_pct :=;

end;

主体很简单就是将更新后的commission_pct列置为

触发

insert into employees(employee_idlast_namefirst_namehire_datejob_idemail

department_idsalarycommission_pct )

values( ChenDonny sysdate );

select commission_pct from employees where employee_id=;

触发器不会通知用户便改变了用户的输入值Oracle触发器语法(四)

数据库关闭或启动startup shutdown等等

before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

说明

无论是否规定了department_id对employees表进行insert的时候

对employees表的department_id列进行update的时候

触发器限制

when (new_valuedepartment_id<> )

限制不是必须的此例表示如果列department_id不等于的时候触发器就会执行

其中的new_value是代表更新之后的值

触发操作

是触发器的主体

begin

:mission_pct :=;

end;

主体很简单就是将更新后的commission_pct列置为

触发

insert into employees(employee_idlast_namefirst_namehire_datejob_idemail

department_idsalarycommission_pct )

values( ChenDonny sysdate );

select commission_pct from employees where employee_id=;

触发器不会通知用户便改变了用户的输入值

               

上一篇:更改Oracle用户名及外部用户验证授权

下一篇:Oracle物化视图:创建最简单物化视图