資料庫DML監控一例

space6212發表於2019-07-21

DBA日常工作的一個重要部分就是對資料進行監控了。其中監控方法有很多,可以用觸發器,可以用審計。

相對來說,審計可以消耗更低的資源,但不能捕獲正在執行的SQL;而觸發器就可以做到,但是它消耗的資源較可觀。

下面用一個例子介紹如何用觸發器監控資料庫的DML操作。


首先建表:

SQL> desc item_update_sql
Name Type Nullable Default Comments
------------- -------------- -------- ------- --------
UPDATE_TIME DATE Y
USERNAME VARCHAR2(30) Y
AUDSID NUMBER Y
CLIENT_IP VARCHAR2(20) Y
SQL_TEXT VARCHAR2(4000) Y
TABLE_NAME VARCHAR2(30) Y
OWNER VARCHAR2(30) Y
ITEM_ID NUMBER Y
OLD_IMAGE_URL VARCHAR2(1000) Y
NEW_IMAGE_URL VARCHAR2(1000) Y

然後建立觸發器:

[php]

Create Or Replace Trigger tr_item_update
/*
監控對item表的item_image_url的更新
*/
After UPDATE
ON test_tag_group.item for each row
DECLARE
stmt VARCHAR2(4000);
sql_text ora_name_list_t;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
stmt := stmt || sql_text(i);
END LOOP;

IF UPPER(STMT) LIKE '%ITEM_IMAGE_URL%' THEN
INSERT INTO item_update_sql(
update_TIME,
USERNAME,
AUDSID,
CLIENT_IP,
SQL_TEXT,
TABLE_NAME,
OWNER,
iTEM_id,
old_image_url,
New_Image_Url
)
Values (
sysdate,
ora_login_user,
userenv('SESSIONID'),
sys_context('userenv','ip_address'),
stmt,'item','souchang2',
:New.item_ID,
:Old.ITEM_IMAGE_URL,
:New.ITEM_IMAGE_URL
);
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('捕獲DML語句異常錯誤:'||SQLERRM);
END;

.

[/php]

以上程式碼在redhat as4 +9204測試透過,在9208下存在一個已知的bug,ora_sql_txt(sql_text) 會返回null,導致觸發器失敗.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章