DML触发器无法捕捉到DML语句内容

[复制链接]
查看11 | 回复6 | 2013-2-25 14:51:24 | 显示全部楼层 |阅读模式
请教个问题,我建了个触发器用来收集对表SCOTT.ORDERS
进行的UPDATE语句,但是建好之后,我运行一个UPDATE语句,会报错信息如下,就是无法抓取到UPDATE语句,这个是怎么回事呢?
报错信息:
UPDATE scott.ORders SET ID=612 WHERE ID=611

*
ERROR at line 1:
ORA-20001: ora_sql_txt未捕捉到任何语句.sql_txt未初始化
ORA-06512: at "SYS.TRIGGER_MONITOR_UPDATE_SQL", line 9
ORA-04088: error during execution of trigger 'SYS.TRIGGER_MONITOR_UPDATE_SQL'
触发器代码:
CREATE OR REPLACE TRIGGER TRIGGER_MONITOR_UPDATE_SQL
AFTER UPDATE ON SCOTT.ORDERS
DECLARE
NNUMBER;
STMT VARCHAR2(4000);
SQL_TEXT ORA_NAME_LIST_T;
BEGIN
DBMS_OUTPUT.PUT_LINE(ORA_SQL_TXT(SQL_TEXT));
N := ORA_SQL_TXT(SQL_TEXT);
IF NVL(N, 200) = 200 THEN
RAISE_APPLICATION_ERROR(-20001,

'ora_sql_txt未捕捉到任何语句.sql_txt未初始化');
ELSE
FOR I IN 1 .. N LOOP
STMT := STMT || SQL_TEXT(I);
END LOOP;
DBMS_OUTPUT.PUT_LINE(STMT);
END IF;
INSERT INTO MONITOR_SQL
(USERNAME, CLIENT_IP, SQL_TEXT, TABLE_NAME, OWNER)
VALUES
(USER, SYS_CONTEXT('userenv', 'ip_address'), STMT, 'T1', 'RAINY');
END;

回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
问题原因知道了,详见:http://yangtingkun.itpub.net/post/468/394693
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
good
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
我做了同样的试验,发现 N := ORA_SQL_TXT(SQL_TEXT);这一句返回的是空值
按照楼主的方法,SQL_TEXT只是声明,然后就被引用,很想知道SQL_TEXT是怎样获取值的?谁帮忙解释下。。。
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
luwch2012 发表于 2013-2-21 15:19
我做了同样的试验,发现 N := ORA_SQL_TXT(SQL_TEXT);这一句返回的是空值
按照楼主的方法,SQL_TEXT只是声 ...

http://www.itpub.net/forum.php?mod=viewthread&tid=1568663
在这个帖子中说,10G数据库只支持DDL语言,经过测试(10g),DDL语言确实可以,但是还是不知道DML语言应该怎么做?
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
ora_sql_txt在10g只对ddl有效了?
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
luwch2012 发表于 2013-2-21 15:37
http://www.itpub.net/forum.php?mod=viewthread&tid=1568663
在这个帖子中说,10G数据库只支持DDL语言, ...

对DML的监控使用细粒度审计(FGA) 实现,具体详见:http://www.itpub.net/thread-239693-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行