触发器的使用
触发器什么时候出发呢?
BEFORE:在触发的DML事件发生之前执行触发器体
AFTER:在触发的DML事件发生之后执行触发器体
INSTEAD OF:执行触发器体来代替触发器事件,用于不可修改 的视图中。
一、语句级的触发器
- 触发事件发生一次,触发器体便执行一次。
- 即使没有任何记录受到影响也会触发一次。
1.触发器格式
CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3 ]
ON table_name
trigger_body
2.创建一个语句级触发器
判断更新操作是否在忙时('08:00' 到 '18:00')!如果是的话提示错误!
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT OR UPDATE ON emp
BEGIN
IF(T0_CHAR(SYSDATE,'DD') IN ('SAT','SUN')) OR TO_CHAR(SYSDATE,'HH24:MI')
NOT BETWEEN '08:00' AND '18:00'
THEN
RAISE_APPLICATION_ERROR(-20500,'YOU MAY INSERT INTO THE EMP
TABLE ONLY DURING BUSINESS HOURS.');
END IF;
END;
3.判定触发器语句
可以使用一下谓词来确定触发器的语句类型。
UPDATING
INSERTING
DELETING
格式:
...
IF UPDATING THEN
v_stmt:='UPDATE';
ELSIF DELETING THEN
v_stmt:='DELETE'
...
二、记录级的触发器
- 对于每一条被触发事件影响的记录,触发器体便执行一次。
- 如果触发器事件未影响任何记录,触发器将不会执行。
1、创建一个记录级触发器
创建格式:如下
CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2 OR event3 ]
ON table_name
[REFERENCINT OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN (condition)]
trigger_body
具体事例:
CREATE OR REPLACE TRIGGER restrict_salary
BEFORE INSERT OR UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
IF(:NEW.job IN ('CLERK','SALESMAN')) AND :NEW.sal > 5000
THEN
RAISE_APPLICATION_ERROR(-20201,
'EMPLOYEE CANNOT EARN THIS AMOUNT.')
END IF;
END;
三、INSTEAD OF 触发器
创建格式:
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
event! [OR event2 OR event3 ]
ON view_name
[REFERENCE OLD AS old | NEW AS new ]
FOR EACH ROW
trigger_body
四、管理触发器
1、禁用或重新启用一个数据库触发器
ALTER TRIGGER trigger_name DISABLE | ENABLE;
2、禁用或重新启用一个表上的所有触发器
ALTER TABLE table_name DISABLE | ENABLE ALL ALL TRIGGERS;
3、重编译一张表上的触发器
ALTER TRIGGER my_trigger COMPILE;
4、删除触发器
DROP TRIGGER trigger_name;
五、数据库触发器
暂无
六、触发器的限制
触发器不能:
执行DDL语句
执行COMMIT,ROLLBACK,SAVEPOINT语句(数据库触发器除外)
查看触发器信息:
包含触发器信息的数据字典:
USER_OBJECTS
USER_TRIGGERS