国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Oracle中的觸發器trigger

瀏覽:109日期:2023-03-12 15:25:09

觸發器是指被隱含執行的存儲過程

一、創建DML觸發器(before/after)

1、行觸發器:

當一個DML操作影響DB中的多行時,對于其中復合觸發條件的每行均觸發一次(for each row)

例1: 建立一個觸發器, 當職工表 emp 表被刪除一條記錄時,把被刪除記錄寫到職工表刪除日志表中去。

CREATE OR REPLACE TRIGGER tr_del_emp   BEFORE DELETE --指定觸發時機為刪除操作前觸發   ON scott.emp   FOR EACH ROW   --說明創建的是行級觸發器BEGIN   --將修改前數據插入到日志記錄表 del_emp ,以供監督使用。   INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )       VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );END;

例2:級聯更新:利用行觸發器實現級聯更新。在修改了主表regions中的region_id之后(AFTER),級聯的、自動的更新子表countries表中原來在該地區的國家的region_id

CREATE OR REPLACE TRIGGER tr_reg_couAFTER update OF region_idON regionsFOR EACH ROWBEGIN DBMS_OUTPUT.PUT_LINE("舊的region_id值是"||:old.region_id  ||"、新的region_id值是"||:new.region_id); UPDATE countries SET region_id = :new.region_id WHERE region_id = :old.region_id;END;

例3:限定只對部門號為80的記錄進行行觸發器操作。

CREATE OR REPLACE TRIGGER tr_emp_sal_commBEFORE UPDATE OF salary, commission_pct       OR DELETEON HR.employeesFOR EACH ROWWHEN (old.department_id = 80)BEGIN CASE     WHEN UPDATING ("salary") THENIF :NEW.salary < :old.salary THEN     RAISE_APPLICATION_ERROR(-20001, "部門80的人員的工資不能降");END IF;     WHEN UPDATING ("commission_pct") THEN  IF :NEW.commission_pct < :old.commission_pct THEN   RAISE_APPLICATION_ERROR(-20002, "部門80的人員的獎金不能降");END IF;     WHEN DELETING THEN  RAISE_APPLICATION_ERROR(-20003, "不能刪除部門80的人員記錄");     END CASE;END;  /*實例:UPDATE employees SET salary = 8000 WHERE employee_id = 177;DELETE FROM employees WHERE employee_id in (177,170);*/

2、語句觸發器:

將整個DML語句作為觸發條件,當它符合約束條件時,激活一次觸發器。

限制對Departments表修改(包括INSERT,DELETE,UPDATE)的時間范圍,即不允許在非工作時間修改departments表。

CREATE OR REPLACE TRIGGER tr_dept_timeBEFORE INSERT OR DELETE OR UPDATEON departmentsBEGIN IF (TO_CHAR(sysdate,"DAY") IN ("星期六", "星期日")) OR (TO_CHAR(sysdate, "HH24:MI") NOT BETWEEN "08:30" AND "18:00") THEN     RAISE_APPLICATION_ERROR(-20001, "不是上班時間,不能修改departments表"); END IF;END;

二、創建替代(instead of )觸發器

用于對視圖(沒有指定WITH CHECK OPTION選項)的DML觸發。

  • 只能被創建在視圖上。
  • 不能指定BEFORE 或 AFTER選項。
  • FOR EACH ROW子可是可選的,即INSTEAD OF觸發器只能在行級上觸發、或只能是行級觸發器,沒有必要指定。

創建INSTEAD_OF觸發器來為 DELETE 操作執行所需的處理,即刪除EMP表中所有基準行:

CREATE OR REPLACE TRIGGER emp_view_delete   INSTEAD OF DELETE ON emp_view FOR EACH ROWBEGIN   DELETE FROM emp WHERE deptno= :old.deptno;END emp_view_delete;

三、創建系統事件觸發器(on schema/on database)

1、當建立在模式(SCHEMA)之上時,只有模式所指定用戶的DDL操作和它們所導致的錯誤才激活觸發器, 默認時為當前用戶模式。

例1:創建觸發器,存放有關事件信息。

--創建觸犯發器CREATE OR REPLACE TRIGGER tr_ddlAFTER DDL ON SCHEMABEGIN   INSERT INTO ddl_event VALUES   (systimestamp,ora_sysevent, ora_login_user,    ora_dict_obj_type, ora_dict_obj_name);END tr_ddl;

2、當建立在數據庫(DATABASE)之上時,該數據庫所有用戶的DDL操作和他們所導致的錯誤,以及數據庫的啟動和關閉均可激活觸發器。

要在數據庫之上建立觸發器時,要求用戶具有ADMINISTER DATABASE TRIGGER權限。

例1:創建登錄觸發器。

CREATE OR REPLACE TRIGGER tr_logonAFTER LOGON ON DATABASEBEGIN   INSERT INTO log_event (user_name, address, logon_date)   VALUES (ora_login_user, ora_client_ip_address, systimestamp);END tr_logon;

四、重新編譯觸發器

ALTER TRIGGER  trigger  COMPILE

刪除觸發器:當刪除表或視圖時,建立在這些對象上的觸發器也隨之刪除。

DROP TRIGGER trigger_name;

禁用或啟用觸發器

ALTER TRIGGER emp_view_delete DISABLE| ENABLE;--使表EMP 上的所有TRIGGER 失效:ALTER TABLE emp DISABLE ALL TRIGGERS;

觸發器和數據字典

相關數據字典:USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS

Oracle 字符集

到此這篇關于Oracle觸發器trigger的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。

標簽: Oracle
相關文章:
主站蜘蛛池模板: 欧美亚洲综合另类在线观看 | 亚洲成人一区 | 一级做a爰片久久毛片人呢 一级做a爰片久久毛片唾 | 国产精品免费久久 | 国产aaa女人十八毛片 | 青青草国产免费一区二区 | 成人影院午夜久久影院 | 国产成人网 | 亚洲厕拍 | 成人做爰全过程免费看网站 | 91大神大战丝袜美女在线观看 | 国产成人精品区在线观看 | 亚洲欧美日本在线观看 | 国产成人精品免费视频 | 亚洲精品一 | 久草视频官网 | 老司机午夜精品网站在线观看 | 精品国产自| 在线视频中文字幕 | 亚洲精品午夜一区二区在线观看 | 亚洲刺激视频 | 亚洲qingse中文久久网 | 中文字幕日韩一区二区 | 韩日一级片 | 中日韩欧美一级毛片 | 久久91精品国产91久久 | 久久91精品牛牛 | 欧美性色黄大片www 欧美性色黄大片一级毛片视频 | 久久国产夜色精品噜噜亚洲a | 加勒比在线视频 | 一级毛片免费在线播放 | 永久免费不卡在线观看黄网站 | 欧美一级三级在线观看 | 国产欧美久久久精品影院 | 最新国产美女一区二区三区 | 欧美午夜不卡在线观看最新 | 成年人免费在线视频网站 | 久久国产精品最新一区 | 欧美一及片 | 九九国产视频 | 在线a毛片免费视频观看 |