--這段sql語句是用來實現oracle后台記錄操作日志的,代替或者補充應用系統的操作日志。
--1.對應的日志記錄表
-------------------------------------------------------------------
create table TEST
(
T_ID NUMBER(4),
T_NAME VARCHAR2(20),
T_AGE NUMBER(2),
T_SEX CHAR(1)
);
----------------------對應的日志記錄表---------------------------END
--2.建立觸發器(觸發器實現日志記錄)
--2.1開啟屏幕輸出:(需要在命令行登陸sqlplus后執行)
sql>set serveroutput on;--在doc窗口和tomcat下可以捕捉到這些輸出信息。
------------------------------------------------------------------
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test for each row -- for each row是為了使用:new和old
DECLARE
v_type VARCHAR2(15);
BEGIN
IF INSERTING THEN
v_type := 'INSERT'||:new.T_NAME;--oracle添加鏈接字符串使用||
DBMS_OUTPUT.PUT_LINE('記錄'||:new.T_NAME||'已經成功插入,並已記錄到日志');--添加 只有new
ELSIF UPDATING THEN
v_type := 'UPDATE'||:old.T_NAME;
DBMS_OUTPUT.PUT_LINE('記錄'||:old.T_NAME||'已經成功更新,並已記錄到日志');--更新有new和old
ELSIF DELETING THEN
v_type := 'DELETE'||:old.T_NAME;
DBMS_OUTPUT.PUT_LINE('記錄'||:old.T_NAME||'已經成功刪除,並已記錄到日志');--刪除只有old
END IF;
my_pro(v_type);
END;
----------------------建立觸發器------------------------------------END
--3.建立日志表。
----------------------------------------------------------------
create table TEST_LOG_1
(
L_USER VARCHAR2(15),
L_TYPE VARCHAR2(15),
L_DATE VARCHAR2(30)
);
--------------------建立日志表---------------------------------END
--4.建存儲過程(注意一定要加上PRAGMA AUTONOMOUS_TRANSACTION;讓這個存儲過程有自治的事務控制,不然會影響A的事務控制)
----------------------------------------------------------------
create or replace procedure my_pro(v_type varchar2)
as
PRAGMA AUTONOMOUS_TRANSACTION;--設置為自治事務且必須加上commit,否則報commit非法。
begin
INSERT INTO TEST_LOG_1 VALUES(user,v_type,TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
commit;
end;
-------------------建存儲過程-------------------------------------END
--最后我們在A中輸入以下測試語句:
INSERT INTO test VALUES(1,'zhao',22,'M');
UPDATE test SET t_name = '30' WHERE t_id = 1;
DELETE test WHERE t_id = 1;
SELECT * FROM test;
SELECT * FROM TEST_LOG_1;