Oracle中使用触发器

/*触发器
触发器是指存放在数据库中,并被隐含执行的存储过程。即当发生特定事件时,oracle会自动执行的代码块。
触发器由触发事件、触发条件和触发操作三部分组成。
触发事件:是指引起触发器触发的SQL语句、数据库事件和用户事件。如:启动关闭进程、用户登录和断开会话,特定表或视图的DML操作等。
触发条件:是指使用where子句指定一个BOOLEAN表达式,返回为true时,触发器执行,反之,不执行。
触发操作:是指包含SQL语句和其他执行代码的PL/SQL块。
*/
/*触发器可分为:语句级、行级、模式级、数据库级、管理级触发器
这里主要讲解语句级、行级触发器
--行级触发器:对sql语句影响的每一行都触发一次(比如,sql语句一次影响10行,那么触发10次)
--语句级触发器:对同一个sql语句,不管影响多少行记录,都只触发一次
*/
/*语句级触发器
CREATE [OR REPLACE] TRIGGER trigger_name
Timing event1[OR event2 OR event3] ON table_name
PL/SQL BLOCK;
其中:Timing指定触发器时机
event指定触发器事件
*/
/*示例:建立BEFORE语句级触发器,保证员工信息的修改只能在工作日*/
CREATE OR REPLACE TRIGGER worked_trigger
BEFORE INSERT OR UPDATE OR DELETE ON emp
BEGIN
  IF to_char(SYSDATE,'DY','nls_date_language=AMERICAN') IN ('SAT','SUN') THEN
    raise_application_error(-20001,'今天是休息时间,不能修改员工信息!');
  END IF;
END worked_trigger;

DELETE FROM emp;  --如果是星期六或星期天此处触发触发器,提示如下:

/*使用条件谓词*/
CREATE OR REPLACE TRIGGER worked_trigger
BEFORE INSERT OR UPDATE OR DELETE ON emp
BEGIN
  IF to_char(SYSDATE,'DY','nls_date_language=AMERICAN') IN ('SAT','SUN') THEN
    CASE
      WHEN INSERTING THEN
        raise_application_error(-20001,'今天是休息时间,不能插入员工信息!');
      WHEN UPDATING THEN
       raise_application_error(-20001,'今天是休息时间,不能修改员工信息!');
      WHEN DELETING THEN
       raise_application_error(-20001,'今天是休息时间,不能删除员工信息!');
    END CASE;
  END IF;
END worked_trigger;

--这样就能明确知道用户进行了什么操作

/*行触发器
CREATE [OR REPLACE] TRIGGER trigger_name
Timing event1[OR event2 OR event3] ON table_name
FOR EACH ROW [WHEN condition]
PL/SQL BLOCK;
其中:FOR EACH ROW表示是行触发器
WHEN可选,指定触发器条件
*/
/*示例:确保员工工资不能低于原有工资*/
CREATE OR REPLACE TRIGGER empSal_trigger
BEFORE UPDATE ON emp
FOR EACH ROW
BEGIN
  IF :new.sal < :old.sal THEN
    raise_application_error(-20010,'工资只能涨,不能跌呀!');
  END IF;
END empSal_trigger;

UPDATE emp SET sal = 100;  --触发触发器,提示如下:

/*管理触发器*/
/*显示触发器信息*/
SELECT * FROM User_Triggers WHERE table_name = 'emp';
/*禁用触发器*/
ALTER TRIGGER trigger_name DISABLE;
/*激活触发器*/
ALTER TRIGGER trigger_name ENABLE;
/*禁止或激活表的所有触发器*/
ALTER TABLE table_name DISABLE ALL TRIGGERS;
ALTER TABLE table_name ENABLE ALL TRIGGERS;
/*重新编译触发器*/
ALTER TRIGGER trigger_name COMPILE;
/*删除触发器*/
DROP TRIGGER trigger_name;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值