Oracle触发器

Posted 疯狂的妞妞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle触发器相关的知识,希望对你有一定的参考价值。

基本结构

create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
when(condition)
begin
 pl/sql语句
end


触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:

  • before:表示在数据库动作之前触发器执行;
  • after:表示在数据库动作之后触发器执行。

触发事件:指明哪些数据库动作会触发此触发器:

  • insert:数据库插入会触发此触发器;
  • update:数据库修改会触发此触发器;
  • delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

场景

/**********在触发器中阻止非法操作**********/
CREATE OR REPLACE TRIGGER "ABCDE" 
BEFORE INSERT OR DELETE OR UPDATE 
ON TABLE1 
FOR EACH ROW 
BEGIN
  IF(TO_CHAR(SYSDATE,DAY) IN (星期五,星期天)) THEN
    RAISE_APPLICATION_ERROR(-20001,不是上班时间,不能修改表格triggertest);
  END IF;
END;


/**********在触发器中操作新值和旧值**********/
CREATE OR REPLACE TRIGGER "ABCDE" 
BEFORE UPDATE 
ON TABLE1 
FOR EACH ROW 
DECLARE //注意声明变量
BEGIN
  :NEW.T_AGE := :NEW.T_AGE + :OLD.T_AGE;
END;

/**********对特定的行进行操作**********/
CREATE OR REPLACE TRIGGER "ABCDE" 
BEFORE DELETE
ON TABLE1 
FOR EACH ROW 
WHEN(OLD.T_AGE<17) //使用when设置过滤条件
BEGIN
  RAISE_APPLICATION_ERROR(-20001,他还是个未成年);
END;


/**********删除触发器**********/
drop trigger "ABCDE";

 




以上是关于Oracle触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?

片段创建的 Intent 不会触发 onNewIntent

导航到另一个片段时触发 API 调用

我如何使用 codeanywhere 片段

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

前端防扒代码片段