数据库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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/231499/viewspace-63774/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值