關(guān)于觸發(fā)器、存儲(chǔ)過(guò)程和DBlink的綜合運(yùn)用
需求描述:
需要在兩個(gè)不同oracl數(shù)據(jù)庫(kù)實(shí)例中進(jìn)行數(shù)據(jù)邏輯處理。如果A實(shí)例中的表有新數(shù)據(jù)插入或者數(shù)據(jù)更新,那么在B實(shí)例中執(zhí)行與之相關(guān)的存儲(chǔ)過(guò)程。
先假設(shè)A數(shù)據(jù)用戶中表TEST有變動(dòng),那么觸發(fā)器觸發(fā)調(diào)用實(shí)例B中的存儲(chǔ)過(guò)程改寫TEST_LOG表
A中操作如下:
1.建表
-------------------------------------------------------------------
create table TEST
(
T_ID NUMBER(4),
T_NAME VARCHAR2(20),
T_AGE NUMBER(2),
T_SEX CHAR(1)
);
-------------------------------------------------------------------
2.建立與B對(duì)應(yīng)的DBLINK
-------------------------------------------------------------------
create database link INFOSYSTEM
connect to infosystem identified by infosystem
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.249)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)';
------------------------------------------------------------------
3.建立觸發(fā)器
------------------------------------------------------------------
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test
DECLARE
v_type VARCHAR2(15);
BEGIN
IF INSERTING THEN
v_type := 'INSERT';
DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功插入,并已記錄到日志');
ELSIF UPDATING THEN
v_type := 'UPDATE';
DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功更新,并已記錄到日志');
ELSIF DELETING THEN
v_type := 'DELETE';
DBMS_OUTPUT.PUT_LINE('記錄已經(jīng)成功刪除,并已記錄到日志');
END IF;
my_pro@infosystem(v_type);
END;
----------------------------------------------------------------
B中操作如下:
1.建表
----------------------------------------------------------------
create table TEST_LOG
(
L_USER VARCHAR2(15),
L_TYPE VARCHAR2(15),
L_DATE VARCHAR2(30)
);
----------------------------------------------------------------
2.建存儲(chǔ)過(guò)程
注意一定要加上PRAGMA AUTONOMOUS_TRANSACTION;讓這個(gè)存儲(chǔ)過(guò)程有自治的事務(wù)控制,不然會(huì)影響A的事務(wù)控制
----------------------------------------------------------------
create or replace procedure my_pro(v_type varchar2)
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
INSERT INTO test_log VALUES(user,v_type,
TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
---------------------------------------------------------------
最后我們?cè)贏中輸入以下測(cè)試語(yǔ)句:
INSERT INTO test VALUES(101,'zhao',22,'M');
UPDATE test SET t_age = 30 WHERE t_id = 101;
DELETE test WHERE t_id = 101;
SELECT * FROM test;
SELECT * FROM test_log@INFOSYSTEM;
結(jié)果可能如下:
TEST無(wú)數(shù)據(jù)
TEST_LOG數(shù)據(jù)
1 AAAPF0AALAAABq8AAA INFOSYSTEM DELETE 2009-06-12 13:45:30
2 AAAPF0AALAAABq8AAL INFOSYSTEM INSERT 2009-06-12 13:45:30
3 AAAPF0AALAAABq8AAM INFOSYSTEM UPDATE 2009-06-12 13:45:30