首页 > Linux操作系统 > Linux操作系统 > 数据库DML监控一例
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/,如需转载,请注明出处,否则将追究法律责任。