11 触发器

一。背景简介

       触发器是一种特殊类型的存储过程,类似于其它编程语言的时间函数,当有操作影响到触发器保护的数据时,触发器就自动发生。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。Oracle提供了如下5种类型的触发器:语句触发器、行触发器、INSTEAD OF触发器、系统条件触发器和用户事件触发器

二。应用场景以及代码实现

(1)创建语句触发器

CREATE OR REPLACE TRIGGER 触发器名称 {BEFORE|AFTER|INSTEAD OF} ON 数据库表名 BEGIN 语句块 END;

--创建语句级触发器(修改数据之前触发)
CREATE OR REPLACE TRIGGER TRI_YJ
BEFORE UPDATE ON STU
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('触发语句触发器');
END IF;
END;
--限制非工作时间操作数据
CREATE OR REPLACE TRIGGER TRI_SJXZ
BEFORE INSERT OR DELETE OR UPDATE ON STU
BEGIN
IF(TO_CHAR(sysdate,'DAY')IN('星期六','星期日')) OR (TO_CHAR(sysdate,'HH24:MI') NOT BETWEEN '9:00' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改STU表');
END IF;
END;

*语句触发可用IF语句和UPDATING,INSERTING,DELETING来进行判断

(2)行触发器

--行级触发器(加FOR EACH ROW参数)
CREATE OR REPLACE TRIGGER TRI_HJ
AFTER UPDATE [of 字段名] ON STU FOR EACH ROW
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('记录已更新');
END IF;
END;
--将删除的记录自动写入日志表,将删除的值A,B,C,D插入表DEL_TEMP中
CREATE OR REPLACE TRIGGER_TE
BEFORE DELETE ON STU FOR EACH ROW
BEGIN
INSERT INTO DEL_TEMP VALUES(:OLD.A,:OLD.B,:OLD.C,:OLD.D);
END;

(3)INSTEAD OF触发器

CREATE OR REPLACE TRIGGER TRI_INFO
INSTEAD OF INSERT ON V_VIEW1 FOR EACH ROW
BEGIN
INSERT INTO STU(A,B,C) VALUES(:NEW.学号,:NEW.姓名,'');
END;

基于多个基本表的视图必须使用INSTEAD OF触发器来支持引用多个表中数据的插入更新删除操作。只能被创建在视图上,且该视图没有指定WITH CHECK OPTION选项,不能指定BEFORE或者AFTER选项,FOR EACH ROW可选,没有必要指定,没有必要在一个表的视图上创建INSTERD OF触发器。

(4)创建用户事件触发器(包括用户登录,注销,修改结构等)

--在执行DDL语句之后,触发
CREATE OR REPLACE TRIGGER TRI_YH
AFTER DDL ON SCHEMA BEGIN
DBMS_OUTPUT.PUT_LINE('执行了DDL语句');
END;

*SCHEMA代表了各种数据库对象(表,视图,索引等)

(5)创建系统事件触发器(包括数据库的启动关闭(STARTUP,SHUTDOWN),用户的登陆退出(LOGON,LOGOFF),服务器错误(SERVERERROR)等)

--对DB的STARTUP,SHUTDOWN和对用户的LOGON,LOGOFF等操作触发
--本例实现当用户登录数据库后,在表中留下日志信息
CREATE OR REPLACE TRIGGER TRI_LOG
AFTER LOGON ON DATABASE BEGIN
INSERT INTO TEST(NAME,ADDRESS,LOG_DATE) VALUES(ORA_LOGIN_USER,ORA_CLIENT_IP_ADDRESS,SYSTIMESTAMP);
END;

*其它常用事件函数如下:

(6)对触发器的其它操作

--查看触发器
SELECT TRIGGER_NAME,TRIGGER_TYPE FROM USER_TRIGGERS WHERE TABLE_NAME='STU';
SELECT TEXT FROM USER_SOURCE WHERE TYPE='TRIGGER' AND NAME='TRI_YJ';
--禁用触发器
ALTER TRIGGER TRI_TEST DISABLE;
--启用触发器
ALTER TRIGGER TRI_TEST ENABLE;
--禁用以表为单位的触发器(禁用该表多个触发器)
ALTER TABLE TEST DISABLE ALL TRIGGER;
--删除触发器
DROP TRIGGER TRI_TEXT;

三。总结

触发器在系统安全以及数据控制方面非常的好用。可以删除备份,记录登录信息,限制安全时间操作,实现级联插入,更新或者删除,非常强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值