歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> unix:行級級觸發器變通成語句級觸發器-變通處理

unix:行級級觸發器變通成語句級觸發器-變通處理

日期:2017/3/3 15:21:14   编辑:Unix基礎知識

unix培訓之變通處理:我們不妨做一下變通處理.將行級級觸發器變通成語句級觸發器.看下面的處理.

1.創建一個package:emp_pkg .

CREATE ORREPLACE PACKAGE emp_pkg AS

/* ----------------------------------

--Author:Kevin.yuan

--create_time: 2008 -07-01

---------------------------------- */

TYPE crArray IS TABLE OF emp%ROWTYPE INDEXBY BINARY_INTEGER;

oldRows crArray; --accept the old valuesof emp

oldEmpty crArray; --initialize values

END emp_pkg;

2.創建一個語句級trigger,用來觸發trigger的時候清空初始化數據.

CREATE ORREPLACE TRIGGER emp_bd_st BEFORE DELETE ON emp

/*----------------------------------

Author:Kevin.yuan

create_time: 2008 -07-01

---------------------------------- */

BEGIN

emp_pkg.oldRows := emp_pkg.oldEmpty;

END emp_bd_st;

3.創建一個行級trigger:emp_d,問題的核心和關鍵就在這裡,這個trigger

並不參與業務邏輯,只是將觸發到的數據載入到emp_pkg.oldRows記錄表裡面去.

CREATE ORREPLACE TRIGGER emp_d AFTER DELETE ON emp FOR EACH ROW

/* ----------------------------------

--Author:Kevin.yuan

--create_time: 2008 -07-01

---------------------------------- */

DECLARE

--ct is the position of the deleted records

ct INTEGER := emp_pkg.oldRows.COUNT + 1;

BEGIN

emp_pkg.oldRows(ct).ename := :OLD.ename;

emp_pkg.oldRows(ct).deptno := :OLD.deptno;

END emp_d;

4.創建一個語句級trigger:emp_d_st,前面3步都是為這一步服務的,這一步

真正參與業務邏輯處理.

CREATE ORREPLACE TRIGGER emp_d_st AFTER DELETE ON emp

/* ----------------------------------

--Author:Kevin.yuan

--create_time: 2008 -07-01

---------------------------------- */

DECLARE

BEGIN

FOR i IN 1 .. emp_pkg.oldRows.COUNT LOOP

INSERT INTO emp_log

(ename, dname, dates)

select emp_pkg.oldRows(i) .ename, dname,sysdate

from dept

WHERE deptno =emp_pkg.oldRows(i).deptno;

END LOOP;

END emp_d_st;

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

來看一下變通後的觸發器是否滿足我們的業務要求:

SQL> alter trigger emp_del_trg disable;

Trigger altered

刪除emp數據

SQL> delete from emp where rownum<3;

2 rows deleted

SQL> select * from emp_log;

ENAME DNAME DATES

——————– ——————– ———–

SMITH RESEARCH 2008-7-1 19

ALLEN SALES 2008-7-1 19

SQL> rollback;

Rollback complete

刪除dept數據.

SQL> delete from dept;

4 rows deleted

SQL> select * from emp_log;

ENAME DNAME DATES

——————– ——————– ———–

至此,目的實現.由於用了多於常規數量的觸發器,對系統性能會造成一定影響,而且,無疑會加重系統後期業務維護負擔,因此,良好的數據庫邏輯設計和代碼編寫思路是很必要的,否則,只能走另外一些路徑,不過,這個由行級觸發器變語句級別觸發器的思路,還是有必要的,當trigger中無法避免的需要access自身表的時候,這無疑是個可以借鑒的解決方案。

Copyright © Linux教程網 All Rights Reserved