Oracle触发器语法及实例

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

一 Oracle触发器语法


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


功能:


1、 允许/限制对表的修改


2、 自动生成派生列,比如自增字段


3、 强制数据一致性


4、 提供审计和日志记录


5、 防止无效的事务处理


6、 启用复杂的业务逻辑


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


1、触发器的语法:


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


ON表名


[FOR EACH ROW]


BEGIN


pl/sql语句


END


其中:


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


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


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


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


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


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


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


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


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

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


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


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


2、举例:


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



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


on auths


begin


if(to_char(sysdate,'DY')='SUN'


RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');


end if;


end



例子:



 CREATE OR REPLACE TRIGGER CRM.T_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME


ON CRM.T_SUB_USERINFO


REFERENCING OLD AS OLD NEW AS NEW


FOR EACH ROW


declare


begin


if :NEW.STAFF_NAME!=:OLD.STAFF_NAME then


begin



客户投诉 


 update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED;


客户关怀


     update T_CUSTOMER_CARE set EXECUTOR_NAME=:NEW.STAFF_NAME


where EXECUTOR_SEED=:OLD.SEED;



客户服务 


     update T_CUSTOMER_SERVICE set EXECUTOR_NAME=:NEW.STAFF_NAME


where EXECUTOR_SEED=:OLD.SEED;


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_value.department_id<>80 )


begin


:new_value.commission_pct :=0;


end;


/



1、触发器的组成部分:


1、 触发器名称


2、 触发语句


3、 触发器限制


4、 触发操作


1.1、触发器名称



     create trigger biufer_employees_department_id


命名习惯:



     biufer(before insert update for each row)


employees表名


department_id列名


1.2、触发语句


比如:


表或视图上的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



说明:


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


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


1.3、触发器限制



     when (new_value.department_id<>80 )


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


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


1.4、触发操作


是触发器的主体 



     begin


:new_value.commission_pct :=0;


end;



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


触发:



     insert into employees(employee_id,last_name,first_name,hire_date,job_id,email,


department_id,salary,commission_pct )


values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);


select commission_pct from employees where employee_id=12345;



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



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



     before insert or update


of department_id


on employees


referencing old as old_value


new as new_value


for each row



说明:


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


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


1.3、触发器限制



     when (new_value.department_id<>80 )


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


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


1.4、触发操作


是触发器的主体 


     begin


:new_value.commission_pct :=0;


end;


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


触发:


     insert into employees(employee_id,last_name,first_name,hire_date,job_id,email,


department_id,salary,commission_pct )


values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);


select commission_pct from employees where employee_id=12345;



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


相关文章
|
6月前
|
SQL 存储 Oracle
Oracle系列十四:触发器
Oracle系列十四:触发器
|
6月前
|
负载均衡 Oracle 关系型数据库
Linux启动多个Oracle实例
Linux启动多个Oracle实例
103 0
|
6月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
99 0
|
5月前
|
存储 运维 Serverless
Serverless 应用引擎产品使用合集之gRPC触发器为什么会每次收到请求时创建一个新的实例
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——触发器-介绍、语法(创建,查看,删除)
MySQL数据库——触发器-介绍、语法(创建,查看,删除)
158 0
|
6月前
|
缓存 Oracle 关系型数据库
Oracle中的触发器与序列:自增列的魔法组合
【4月更文挑战第19天】Oracle数据库中,通过触发器和序列的组合可实现自增列功能。序列充当自动计数器,提供递增数值,而触发器则在插入新记录时自动分配序列值。创建序列如`CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1 NOCACHE`,然后创建触发器`TRIGGER trg_employees_before_insert`在`BEFORE INSERT`时将序列的下一个值赋予`employee_id`。这种方式使得在插入记录时无需手动设置ID,提高了效率。但使用时需注意序列状态、并发性和性能优化。
|
SQL 存储 Oracle
Oracle触发器----你会教对象触发嘛
Oracle触发器----你会教对象触发嘛
|
SQL 存储 Oracle
Oracle 游标&子程序&触发器
游标的作用:处理多行数据,类似与java中的集合
82 0
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
1730 0
|
SQL Oracle 关系型数据库
Oracle 19c 启动和关闭实例保存PDB状态
十年以上 MySQL Oracle DBA从业者,MySQL 5.7 OCP, 微信号: jinjushuke
335 0

推荐镜像

更多