ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库DML监控一例

数据库DML监控一例

原创 Linux操作系统 作者:space6212 时间:2019-07-21 12:36:01 0 删除 编辑

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

下一篇: 今天拿了块奖状
请登录后发表评论 登录
全部评论

注册时间:2005-01-25

  • 博文量
    245
  • 访问量
    211322