例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
–创建临时表
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;

CREATE OR REPLACE TRIGGER tr_del_emp
BEFORE DELETE --指定触发时机为删除操作前触发
ON scott.emp
FOR EACH ROW --说明创建的是行级触发器
BEGIN --将修改前数据插入到日志记录表del_emp,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
–测试触发器
DELETE emp WHERE empno=7788;
DROP TABLE emp_his;
DROP TRIGGER del_emp;
在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。
概念:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。
触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。
功能:
1、允许/限制对表的修改
2、自动生成派生列,比如自增字段
3、强制数据一致性
4、提供审计和日志记录
5、防止无效的事务处理
6、启用复杂的业务逻辑
建立对象:

  1. 触发事件:引起触发器被触发的事件。 例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
  2. 触发时间:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发。
  3. 触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
  4. 触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
  5. 触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
    触发次序:
    执行 BEFORE行级触发器
    执行 DML语句
    执行 AFTER行级触发器

触发器语法格式
create [or replace] trigger 触发器名 触发时间 触发事件

[on 表 | on schema ]

[referencing new as 别名 old as 别名]

[for each row]

pl/sql 语句

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

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

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

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

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

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

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

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

表 名:数据库触发器所在的表。
on schema : 可以通过事件引发ora_sysevent 获取当前操作

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
别名 :用于定义接收参数
例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
–创建临时表
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;

CREATE OR REPLACE TRIGGER tr_del_emp
BEFORE DELETE --指定触发时机为删除操作前触发
ON scott.emp //在 scott.emp表中建立
FOR EACH ROW --说明创建的是行级触发器
BEGIN --将修改前数据插入到日志记录表del_emp,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate ) //表,列
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate ); //名
END;
–测试触发器
DELETE emp WHERE empno=7788;
DROP TABLE emp_his;
DROP TRIGGER del_emp;
替代触发器
INSTEAD OF触发器又称为替代触发器,用于执行一个替代操作来代替触发事件的操作。例如:针对INSERT事件的INSTEAD OF触发器,它由INSERT语句触发,当出现INSERT语句时,该语句不会被执行,而是执行INSTEAD OF触发器中定义的语句。
创建INSTEAD OF触发器需要注意以下几点:

例:当需要针对视图创建触发器来处理业务逻辑,或数据流程时, 可以用替代触发器来实现对视图相关表的操作.
代码演示:
create table user_info ( id number,name varchar2(200));
insert into user_info values(1,‘DINYA’);
create table skill( id number,skill varchar2(300),user_id number);
insert into skill values(1,‘打字’,1);
create or replace view user_skills as select a.id ,a.name,b.skill from user_info a,skill b where a.id=b.user_id;
select * from user_skills
update user_skills t set t.skill=‘上网’

create or replace trigger user_skills_update
instead of update on user_skills
for each row
begin
update skill set skill=:new.skill where user_id=:old.id;
end ;
–测试
update user_skills t set t.skill=‘上网’ where t.id=1;
系统事件触发器:系统事件触发器在发生如数据库启动或者关闭等系统事件时触发,包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。
例5:创建登录、退出触发器
代码演示:
CREATE TABLE log_event
(user_name VARCHAR2(10),
address VARCHAR2(20),
logon_date timestamp,
logoff_date timestamp);
–创建登录触发器
CREATE OR REPLACE TRIGGER tr_logon
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO log_event (user_name, address, logon_date)
VALUES (ora_login_user, ora_client_ip_address, systimestamp);
END tr_logon;
创建退出触发器
代码演示:
CREATE OR REPLACE TRIGGER tr_logoff
BEFORE LOGOFF ON DATABASE
BEGIN
INSERT INTO log_event (user_name, address, logoff_date)
VALUES (ora_login_user, ora_client_ip_address, systimestamp);
END tr_logoff;
DDL触发器:DDL触发器由DDL语句触发,例如:CREATE、ALTER和DROP语句。DDL触发器同样可以分为BEFORE触发器与AFTER触发器
代码演示:
create table ddl_log (operation varchar2(30),obj_owner varchar2(30),object_name varchar2(30),sql_text varchar2(64),attempt_by varchar2(30),attempt_dt date);

create or replace procedure log_proc(ose ddl_log.operation%type,
odoo ddl_log.obj_owner%type,
odon ddl_log.object_name%type) is
begin
insert into ddl_log
select ora_sysevent,
ora_dict_obj_owner,
ora_dict_obj_name,
‘not allowed’,
user,
sysdate
from dual;
end log_proc;

create or replace trigger save_our_db
before drop or truncate on schema
declare
oper ddl_log.operation%TYPE;
begin
–select ora_sysevent into oper from dual;
log_proc(ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name);
end save_our_db;

–测试
drop table emp_his
触发器的应用
Oracle触发器一般应用在以下方面:
1 确保数据库的安全性
可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
可以基于数据库中的数据限制用户的操作,例如不允许价格的升幅一次超过10%。
2 提供复杂的审计功能
审计用户操作数据库的语句。
把用户对数据库的更新写入审计表。
3 维护不同数据库之间同步表
在不同的数据库之间可以利用快照(oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中)来实现数据的复制,但有些系统要求两个数据库数据实时同步,就必须利用触发器从一个数据库中向另一个数据库复制数据。
编写触发器注意事项
1、触发器不接受参数。
2、一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
3、在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
4、触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
5、触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
6、在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

Oracle触发器分类及使用相关推荐

  1. oracle中触发器只能用于表吗,Oracle触发器的分类和使用

    Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发.触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触 ...

  2. oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)

    oracle触发器管理: 1.概念 2.建立一个简单的触发器: 3.触发器的作用 4.触发条件 a.触发事件 b.触发时间 c.触发级别 d.触发限制 e.触发对象 5.创建及使用触发器 6.触发器分 ...

  3. Oracle 触发器trigger介绍

    一.触发器定义 Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器.触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等. 二.触发器分类 ...

  4. 十一、Oracle 触发器

    一.Oracle 操作集 二.Oracle 数据类型 三.Oracle 函数 四.Oracle 视图 五.Oracle 序列 六.Oracle 同义词 七.Oracle 索引 八.Oracle PL/ ...

  5. oracle触发器if多条件,oracle触发器使用总结

    触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们.触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处 ...

  6. Oracle 触发器调用存储过程|转||待研究|

    Oracle触发器调用存储过程资料收集整理 触发器:Trigger 存储过程:Stored Procedure // ******************** 收集1 **************** ...

  7. SQL server与Oracle触发器的创建与使用

    SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...

  8. oracle触发器高级教程

    [转自]http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153503 CREA ...

  9. oracle行级的触发器,Oracle触发器Trigger2行级

    create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...

最新文章

  1. 【效率】超详细!手把手带你快速入门 GitHub!
  2. HTML文档包应含几个基本标记,HTML中包含哪些基本的标记?
  3. Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式
  4. Redis:17---常用功能之(事务)
  5. 高斯核函数python代码_单类SVM:SVDD
  6. VS2015 编译程序时无法查找或打开PDB文件
  7. 工具:数据库设计ER图
  8. 小米正式递交上市招股书:雷军股权绝对掌控
  9. 单臂路由及链路聚合+实验配置(均使用思科模拟器Cisco Packet Tracer Student)
  10. mysql索引失效的常见原因
  11. php除数不能为零,0为什么不能做除数(为什么0不能作为除数)
  12. 2022.11.16 英语背诵
  13. 重置CAD 或者Civil 3d的所有环境
  14. 情商高手与小白的言辞,差别究竟在哪里?
  15. 百家号同步公众号的自媒体工具有吗?
  16. Placement service – placement安装(wallaby-allinone)
  17. 【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换
  18. 计算机软件开发如何提高效率,开发人员必知:提高工作效率的7个技巧
  19. QueryRunner是什么?
  20. Linux用ls和grep统计文件个数

热门文章

  1. 小程序setdata优化_关于小程序setData的写法,如何减少setData次数?优化程序性能...
  2. 小车自动往返工作原理_小车自动往返.ppt
  3. 两万字梳理 Java 入门进阶那些事
  4. 图像识别与检测技术的创新
  5. 关于符合车规的高精度定位产品
  6. Windows_PC端微信双开/多开方法汇总(不改软件和插件,批处理)[微信技术教程]
  7. windowns11系统下安装Proteus_8.7教程
  8. Workbench中DM建模草图修改不了的解决办法
  9. UVALive 5075 Intersection of Two Prisms(柱体体积交)
  10. JS 下载文件方法分享(解决图片文件无法直接下载和 IE兼容问题)