概述
触发器用来定义与数据库有关的某个事件发生时,数据库将要执行的操作。例如执行Insert、Update和Delete等命令,或者一些DDL命令和数据库事件(如关闭和登录)时,可以执行触发器。
*因为触发器具有灵活性,所以可以用来补充参照完整性,但不应用来替代参照完整性。在应用程序中强制实施某些业务规则时,首先应依赖Oracle声明的参照完整性,然后才用触发器来强制实施不能通过参照完整性进行编码的规则。
1.相关的权限
系统权限: Alter (Any) Table
Create (Any) Trigger
Alter (Any) Trigger
Administer Database Trigger(在数据库级别的事件上创建触发器时需要)
表权限:除了启动触发器事件的表外,触发器还可以引用表,例如在表A每次发生变化时,在表B中插入一条记录。为了实现这种操作,需要有权对B表进行插入操作。
总之,需要具有触发器本身的权限,以及涉及到的所有表的相关操作必要的权限,根据具体情况具体分析。
**触发器的事务所需权限不能来自角色,必须直接被授予触发器的创建者
2.触发器的类型
触发器的类型由触发事务的类型和执行触发器的级别定义。
2.1 行级触发器:
对受DML语句影响的每一行执行一次。它是最常用的触发器,通常用于数据审计中。
2.2 语句级触发器:
对每条DML语句执行一次,因此一般不常用于与数据相关的活动,而是作为针对在一个表上的各种操作的安全措施。
2.3 BEFORE和AFTER触发器:
可以设置触发器在事件之前还是之后执行。但要注意,对于数据库级别的事件要具体分析,例如不能在登录之前执行触发器。
2.4 INSTEAD OF触发器:
可以使用Instead of触发器告诉Oracle要做的工作,而不是调用触发器。它主要用于支持对象视图和关系视图。例如,如果一个视图涉及两个表的连接,则在视图上使用UPDATE命令权限会受到限制,此时使用INSTEAD OF触发器就可以让Oracle执行触发器中的代码来代替INSERT、UPDATE和DELETE命令。
2.5 模式触发器
可以在模式级别的操作上创建触发器,这些操作包括:
CREATE TABLE ALTER TABLE
DROP TABLE AUDIT
RENAME TRUNCATE
REVOKE 等。
甚至可以创建BEFORE DDL触发器。大多数情况下,模式触发器提供两种功能:1. 阻止DDL操作。2.在发生DDL操作时提供额外的安全监控。
2.6 数据库级触发器
可以创建在数据库级别的事件上触发的触发器,包括错误、登录、注销、启动和关闭。可以用这种触发器自动进行数据库维护或审计操作。
3.触发器的语法
CREATE [OR REPLACE] TRIGGER [schema.] trigger
{BEFORE | AFTER | INSTEAD OF}
{dml_event_clause | {ddl