Oracle触发器详解:Instead-of与系统事件触发器
"Oracle数据库中的触发器是一种数据库对象,它能够在特定的数据操作(DML: INSERT, UPDATE, DELETE)或数据库事件(DDL: CREATE, ALTER, DROP, TRUNCATE)发生时自动执行预定义的SQL语句或PL/SQL代码块。触发器可以用于实现复杂的业务规则、数据验证和审计等功能。" 在Oracle中,有几种基本类型的触发器: 1. **Instead-of 触发器**: Instead-of触发器主要用于视图。当试图对一个联接多张表的视图执行DML操作时,通常会受到限制。Instead-of触发器在此时发挥作用,可以在触发器中编写代码,模拟对底层表的直接操作。例如,如果用户尝试在视图上插入新记录,Instead-of触发器会在幕后处理实际的INSERT操作,对每个相关的表进行相应的操作。 创建Instead-of触发器的语法如下: ```sql CREATE OR REPLACE TRIGGER trigger_name INSTEAD OF INSERT|UPDATE|DELETE ON view_name FOR EACH ROW -- 触发器的PL/SQL代码块 ``` 2. **行级(Row-level)触发器**: 这种触发器在单行级别的DML操作后或前执行。例如,`BEFORE INSERT OR UPDATE`触发器会在每条记录被插入或更新之前运行,`AFTER INSERT OR UPDATE`则在操作完成后执行。这些触发器可以用来执行基于行的验证、计算或关联操作。 3. **语句级(Statement-level)触发器**: 与行级触发器不同,语句级触发器在整个DML语句执行后或前触发,不针对单个行。例如,如果一个UPDATE语句更新了多行,只有一个触发器实例会被执行。 4. **DDL触发器**: DDL触发器在创建、修改或删除表、视图、索引等数据库对象时触发。这些触发器可以用来实施数据库对象级别的权限控制,或者在执行DDL操作时记录审计日志。 创建DDL触发器的示例: ```sql CREATE OR REPLACE TRIGGER trigger_name BEFORE CREATE OR ALTER OR DROP ON schema|database -- 触发器的PL/SQL代码块 ``` 5. **数据库事件触发器**: 这类触发器与数据库的启动、关闭、用户登录/登出等系统事件相关。例如,可以在数据库关闭前记录日志,或在用户登录时执行特定的操作。 创建数据库事件触发器的例子: ```sql CREATE OR REPLACE TRIGGER trigger_name BEFORE|AFTER STARTUP|SHUTDOWN|LOGON|LOGOFF ON DATABASE -- 触发器的PL/SQL代码块 ``` 使用触发器需要注意性能影响,因为它们增加了数据库的复杂性和潜在的并发问题。在设计触发器时,应确保它们是透明的,并尽可能高效,以避免对应用程序性能造成不利影响。同时,要确保触发器的逻辑正确无误,避免产生意料之外的结果。
一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器
语法:
create or replace trigger trigger_name
after|before insert|update|delete
on table_name
for each row
二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法是这样的:
create or replace trigger trigger_name
instead of insert|update|delete
on view_name
for each row
三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化
语法:
create or replace trigger trigger_name
before|after create|alter|drop|truncate
on schema|database
例:
--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象
create or replace trigger apps_no_ddl
before create or alter or drop or truncate
on apps
begin
raise_application_error(-20001,'不允许用DDL操作APPS用户的对象');
end;
四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况
语法:
before|after startup|shutdown|logon|logoff
on database
例:
--记录数据库关闭的时间(shutdown类型要用关键字before,startup用after)
create or replace trigger db_shutdown
before shutdown
on database
begin
insert into test_tbl(log_event) values('db shutdown at '||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
--记录用户LOGON时间(logoff类型要用关键字before,logon用after)
create or replace trigger user_logon_db
after logon
on database
begin
insert into test_tbl(username,logon_time) values(user,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行.
----------------------------------------------------------------
触发器使用教程和命名规范
目 录
触发器使用教程和命名规范 1
1,触发器简介 1
剩余13页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 深入理解23种设计模式
- 制作与调试:声控开关电路详解
- 腾讯2008年软件开发笔试题解析
- WebService开发指南:从入门到精通
- 栈数据结构实现的密码设置算法
- 提升逻辑与英语能力:揭秘IBM笔试核心词汇及题型
- SOPC技术探索:理论与实践
- 计算图中节点介数中心性的函数
- 电子元器件详解:电阻、电容、电感与传感器
- MIT经典:统计自然语言处理基础
- CMD命令大全详解与实用指南
- 数据结构复习重点:逻辑结构与存储结构
- ACM算法必读书籍推荐:权威指南与实战解析
- Ubuntu命令行与终端:从Shell到rxvt-unicode
- 深入理解VC_MFC编程:窗口、类、消息处理与绘图
- AT89S52单片机实现的温湿度智能检测与控制系统