怎么查询一个用户执行过的SQL语句
本帖最后由 wh62592855 于 2009-11-20 20:55:50 编辑
今天论坛上一个朋友问怎么查询之前执行过的SQL语句,我当时没多想就给回了个
select sql_text from v$sql where parsing_schema_name='USERNAME' order by last_load_time desc;
可是我试了试发现这个语句是有些问题的,好像并不能查询该用户执行的所有SQL语句。比如说我在试验的过程中,SELECT和INSERT可以查出来,CREATE TABLE和DROP TABLE都不行。
而且有时候通过其他一些视图查出来的结果中包含了一些不该有的操作,看样子都是些对系统内部表的查询与操作,而并不是用户真正输入的语句。
V$SQL,V$SQL_TEXT,V$SQLAREA,V$OPEN_CURSOR,这几个视图里面字段又超级多,真的无从下手,有时都不知道该查哪个视图了,可能由于自己对这几个视图的定义和区别理解的还不够深吧,呵呵。这里也希望大家不吝赐教。
仔细想了想,关于这个查询用户执行SQL语句的话题应该可以分出不止一个分支的。比如说:
①查询某个用户在某段时间内执行过的所有SQL语句
②查询当前状态(意味着该SESSION并未断开 正处于活动状态)下某个用户执行过的所有SQL语句
③……
暂时好像就想到了这两个情况而已,哪位朋友想出新的情况了欢迎补充,大家一起讨论。
专门写这么个帖子,希望可以借此帖把这方面的事情彻底的搞清楚,当然,这离不开大家的帮助。
各位踊跃发言哈!
我嘛还才疏学浅,暂时连上面那两种情况的查询语句都还写不出来。
如果哪位以前对这方面做过专门的研究,或有有好的文章推荐,也可以贴出来大家一起学习学习!
当然,我这里说的是用查询来实现哦,LOGMINER和审计咱就不提了哦。
------最佳解决方案--------------------v_sql_id);12 dbms_output.put_line('sqltext is:'
------其他解决方案--------------------哦……即时老化
呵呵 这个词用的很生动呀
SQL> select name from v$statname where statistic#=339;
NAME
--------------------
bytes received via S
QL*Net from dblink
339这个统计指标代表的是硬解析?!
------其他解决方案--------------------全部执行的sql都可以在V$SQL,V$SQL_TEXT,V$SQLAREA三个视图中找到。
不过前提是该sql还在shared pool中存在。
你做做实验就知道了呀。
------其他解决方案--------------------①查询某个用户在某段时间内执行过的所有SQL语句
②查询当前状态(意味着该SESSION并未断开 正处于活动状态)下某个用户执行过的所有SQL语句
③……
大家都踊跃发言哈
这几个问题还没人回答呢
补充也可以
是不是周末了都休息去了呀^_^
------其他解决方案--------------------如果查询语言是追踪不到的.
其他的也许能追踪到,帮顶.
------其他解决方案--------------------帮顶
------其他解决方案--------------------
呵呵 这个确实是可以的 不过就是不完全
------其他解决方案--------------------SQL_TEXT显示的内容有问题
------其他解决方案--------------------你看v$sqltext
OPER@tl> create or replace trigger tr_ddl
2 after create on schema
3 declare
4 v_sql_id varchar2(100);
5 v_sql varchar2(100);
6 begin
7 select sql_id,sql_text into v_sql_id,v_sql