日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle入门(十四.20)之创建DML触发器:第一部分

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle入门(十四.20)之创建DML触发器:第一部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是DML觸發器?

DML觸發器是執行SQL DML語句(INSERT,UPDATE或DELETE)時自動觸發(執行)的觸發器。 您可以通過兩種方法對DML觸發器進行分類:
?執行時間:BEFORE,AFTER或INSTEAD觸發DML語句。
?它們執行的次數:一次對于整個DML語句(一個語句觸發器),或者對于受DML語句影響的每一行一次(一行

觸發)。


二、創建DML語句觸發器

CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON object_name trigger_body

?timing:當觸發器觸發與觸發事件有關時。 值在之前,之后或停止。

?event:哪個DML操作導致觸發器觸發。 值是INSERT,UPDATE [OF列]和DELETE。

?object_name:與觸發器關聯的表或視圖。

?trigger_body:由觸發器執行的操作在匿名塊中定義。

(1)語句觸發時序

觸發器何時應該觸發?
?BEFORE:在表格上的觸發DML事件之前執行觸發器主體。
?AFTER:在表格上觸發DML事件后執行觸發器主體。
?INSTEAD OF:在視圖上執行觸發器主體而不是觸發DML事件。
編程要求將決定使用哪一個。

(2)觸發時間和事件示例

第一個觸發器在員工的工資更新之前立即執行:

CREATE OR REPLACE TRIGGER sal_upd_trigg BEFORE UPDATE OF salary ON employees BEGIN ... END;員工被刪除后立即執行第二個觸發器:
CREATE OR REPLACE TRIGGER emp_del_trigg AFTER DELETE ON employees BEGIN ... END;

可以限制UPDATE觸發器更新特定列或列:

CREATE OR REPLACE TRIGGER sal_upd_trigg BEFORE UPDATE OF salary, commission_pct ON employees BEGIN ... END;

觸發器可能有多個觸發事件:

CREATE OR REPLACE TRIGGER emp_del_trigg AFTER INSERT OR DELETE OR UPDATE ON employees BEGIN ... END;


三、怎樣使觸發器觸發?

(1)聲明觸發器:
?觸發語句的每次執行僅觸發一次
?是DML觸發器的默認類型
?即使沒有行受到影響,也會觸發一次
CREATE OR REPLACE TRIGGER log_emp_changes AFTER UPDATE ON employees BEGIN INSERT INTO log_emp_table (who, when)VALUES (USER, SYSDATE); END;

現在執行UPDATE語句:

UPDATE employees SET ... WHERE ...;觸發器觸發多少次,如果UPDATE語句修改三行? 十行? 一行?沒有行?

(2)觸發器何時觸發

此幻燈片顯示與事件INSERT INTO departments關聯的語句觸發器的觸發順序:
INSERT INTO departments(department_id,department_name, location_id) VALUES (400, 'CONSULTING', 2500);


四、觸發器觸發序列

即使觸發的DML語句影響許多行,語句觸發器也只觸發一次:

UPDATE employeesSET salary = salary * 1.1WHERE department_id = 50;

(1)DML語句觸發器示例1

每當一行或多行成功插入到EMPLOYEES中時,此語句觸發器就會自動將一行插入到日志記錄表中。


(2)DML語句觸發器示例2

每次在DEPARTMENTS表上成功執行DML操作時,此語句觸發器都會自動向日志記錄表中插入一行。

CREATE OR REPLACE TRIGGER log_dept_changes AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS BEGIN INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE); END;(3)DML語句觸發器示例3
這個例子展示了如何使用DML觸發器來強制執行復雜的業務規則,這些規則不能被約束強制執行。
希望在正常工作日(星期一至星期五)允許INSERT進入EMPLOYEES表,但在周末(周六和周五)禁止INSERT

星期日)。

如果用戶試圖在周末期間向EMPLOYEES表中插入一行,則用戶將看到錯誤消息,觸發器失敗,并且觸發語句被回滾。以下顯示了此示例所需的觸發器代碼。


CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGIN IF TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN') THENRAISE_APPLICATION_ERROR(-20500,'You may insert into EMPLOYEES'||' table only during business hours');END IF; END;(4)測試SECURE_EMP
用戶嘗試在周末插入一行:
INSERT INTO employees (employee_id, last_name, first_name, email, hire_date, job_id, salary, department_id) VALUES (300, 'Smith', 'Rob', 'RSMITH', SYSDATE,'IT_PROG', 4500, 60); ORA-20500: You may insert into EMPLOYEES table only during business hours. ORA-06512: at “USVA_TEST_SQL01_T01.SECURE_EMP”, line 4 ORA_04088: error during execution of trigger ‘USVA_TEST_SQL01_T01.SECURE_EMP’ 2. VALUES (300, ‘Smith’, ‘Rob’, ‘RSMITH’, SYSDATE, ‘IT_PROG’, 4500, 60);(5)最后一個例子

該觸發器不能成功編譯。 為什么不?

CREATE OR REPLACE TRIGGER log_dept_changes AFTER INSERT OR UPDATE OR DELETE ON DEPARTMENTS BEGIN INSERT INTO log_dept_table (which_user, when_done)VALUES (USER, SYSDATE);COMMIT; END;

總結

以上是生活随笔為你收集整理的Oracle入门(十四.20)之创建DML触发器:第一部分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。