触发器——保证数据的正确性
什么是触发器
触发器和存储过程比较类似,它由PL/SQL编写并存储在数据库中,它可以调用存储过程,但触发器的调用和存储过程的不一样,它只能由数据库的特定事件来触发
特定事件主要有:
- 用户在指定的表或视图做DML操作
- INSERT
- UPDATE
- DELECTE
- 用户做DDL操作
- CREATE
- ALTER
- DROP
- 数据库事件
- LOGON/LOGOFF 用户的登录注销
- STARTUP/SHUTDOWN 数据库的打开关闭
- ERRORS 特定错误消息
触发器的作用
- 自动生成自增长字段
- 执行更复杂的业务逻辑
- 防止无意义的数据操作
- 提供审计
- 允许或限制修改某些表
- 实现完整性规则
- 保证数据的同步复制
触发器的类型
- 数据操纵语言(DML)触发器。
数据定义语言(DDL)触发器
符合触发器
- INSTEAD OF触发器。
- 用户和系统事件触发器
触发器的语法
--DML触发器的主要语法
CREATE [ OR REPLACE ] TRIGGER [schema.] trigger
{BEFORE | AFTER | INSTEAD OF} --触发类型,前触发,后触发,替换类型
{DELETE | INSERT | UPDATE --表示触发的事件
[OF column [, column ]...] --触发条件具体到的某列
}
[ OR {DELETE | INSERT | UPDATE
[OF column [, column ]...]
}
]...
{ON [schema. ]table | [schema. ] view}
[FOR EACH ROW ] --表示行级触发器,省略则为语句级触发器
[FOLLOWS [ schema.] trigger [,[ schema. ] trigger ]...]--触发器执行的顺序
[ENABLE | DISABLE] --设置触发器是否为可用状态
[WHEN (condition)]
trigger_body
--DDL和数据库事件触发器语法如下:
CREATE [ OR REPLACE ] TRIGGER [schema.] trigger
{ BEFOR | AFTER}
{ ddl_event [OR ddl_event]... --DDL事件,用or连接
| database_event [OR database_event]...
}
ON { [schema.] SCHEMA
| DATABASE
}
[FOLLOWS [ schema.] trigger [,[ schema. ] trigger ]...]--触发器执行的顺序
[ENABLE | DISABLE] --设置触发器是否为可用状态
[WHEN (condition)]
trigger_body
DDL事件 | 简介 |
---|---|
ALTER | 修改对象 |
ANALYSE | 分析统计信息 |
AUDIT/NOAUDIT | 启用或取消审计 |
COMMENT | 注解列或表的含义 |
CREATE | 创建对象 |
DROP | 删除对象 |
GRANT | 授权操作 |
RENAME | 修改对象名称 |
REVOKE | 取消权限 |
TRUNCATE | 删除行记录 |
触发器由三部分组成。它们分别是触发事件或语句,触发器限制,触发器动作。
使用SQL*PLUS操作触发器
创建触发器
创建触发器的首要条件是要有相关的权限。用户模式下如果想在自己的对象上创建触发器,则必须具有CREATE TRIGGER系统权限,如果想在其他用户上创建触发器,则需要有CREATE ANY TRIGGER权限,如果在数据库上创建触发器。则需要有ADMINISTER DATABASE TRIGGER系统权限。
--一个简单的触发器
CREATE TRIGGER FIRST_TGR
AFTER DELETE
ON PRODUCTINFO --触发器作用的表
BEGIN
IF DELETING THEN
DBMS_OUTPUT.put_line('删除数据操作! ');
END IF;
END;
查看触发器
--查看触发器的名称。执行如下脚本:
SELECT OBJECT_NAME FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'TRIGGER'
--查看触发器内容,有了触发器名称就可以查看其具体内容
SELECT * FROM USER_SOURCE WHERE NAME = 'FIRST_TGR' ORDER BY LINE;