怎样在Oracle的Trigger中使用v$session等Dynamic Performance View

来源:百度知道 编辑:UC知道 时间:2024/06/30 10:53:52
这样一个SQL:
insert into log_v_session select * from v$session;
注:log_v_session是自己建的表,结构和v$session一样

直接跑没有问题,但是放到一个On Delete Trigger里面,trigger就编译不过去,总是提示v$session这个Table or view does not exist。
v$session不能在Trigger里面用吗?还是权限问题?

用这个东西是想在一条数据被删除的时候记录下这个删除操作的session信息和删除用的Sql,有没有其他办法?
原因很简单,就是权限问题,DBA最后给搞定了

9i后,可利用系统定义事件ORA_SQL_TXT属性,返回触发触发器的SQL语句。

请看例子: (T可测试表,你可随便输入示例值,其中T_LOG用来记录SQL语句,当然你也可扩充其他信息).

SQL> CREATE TABLE T_LOG (EXECUTE_DATE DATE, SQL_STATMENT CLOB);

SQL> CREATE OR REPLACE TRIGGER T
2 BEFORE DELETE ON T
3 FOR EACH ROW
4 DECLARE
5 V_SQL_OUT ORA_NAME_LIST_T;
6 V_NUM NUMBER;
7 V_SQL_STATMENT VARCHAR2(32767);
8 BEGIN
9 V_NUM := ORA_SQL_TXT(V_SQL_OUT);
10 FOR I IN 1 .. V_NUM LOOP
11 V_SQL_STATMENT := V_SQL_STATMENT || V_SQL_OUT(I);
12 END LOOP;
13 INSERT INTO T_LOG (EXECUTE_DATE, SQL_STATMENT)
14 VALUES (SYSDATE, V_SQL_STATMENT);
15 END;
16 /

然后你试试在T表上做Delete操作.