监控当前数据库谁在运行什么SQL语句 
SELECT osuser, username, sql_text from v$session a, v$sqltext b 
where a.sql_address =b.address order by address, piece;
也可以通过审计功能来对数据库进行审计,但对数据库的性能有一定的影响。

解决方案 »

  1.   

    sys用户下的v$sql视图中存有最新的用户执行sql语句。
      

  2.   

    To bzszp(SongZip):   这位老兄,能否说的再详细一些,我的数据库中有一个Sample表,我想给它建一个触发器,当该表内容被修改后,可以捕获到SQL语句的操作内容,然后将该SQL语句写入另外的一个表中。也就是说,我只想捕获对Sample表的操作。谢谢!!
      

  3.   

    假设我想对Sample表监测,触发器的内容如下:
    结果保存在OperationRecord表中。CREATE OR REPLACE TRIGGER TESTTRIGGER AFTER INSERT OR DELETE OR UPDATE OF "ID", "VALUE" ON Sample FOR EACH ROW
    DECLARE
    v_TriggerType VARCHAR2(10);
    BEGIN
      IF UPDATING THEN
         v_TriggerType :='UpDate';
         SELECT username, sql_text from v$session a, v$sqltext b;
         INSERT INTO OperationRecord(CHANGETYPE, CREATETIME, USERNAME, SQLTEXT)
         VALUES(v_TriggerType, SYSDATE, username, sql_text);
      END IF;                                   
      IF DELETING THEN
         v_TriggerType :='Delete';
         SELECT username, sql_text from v$session a, v$sqltext b 
         INSERT INTO OperationRecord(CHANGETYPE, CREATETIME, USERNAME, SQLTEXT)
         VALUES(v_TriggerType, SYSDATE, username, sql_text);
      END IF;                                    
      IF INSERTING THEN
         v_TriggerType :='Insert';
         SELECT username, sql_text from v$session a, v$sqltext b 
         INSERT INTO OperationRecord(CHANGETYPE, CREATETIME, USERNAME, SQLTEXT)
         VALUES(v_TriggerType, SYSDATE, username, sql_text);
      END IF;                             
    END TESTTRIGGER;看看上面的触发器错在那里???
    谢谢!!
      

  4.   

    朋友啊,不知是我愚笨还是眼花,我好像没有看见你对变量username,sql_text的定义。还有啊你的SELECT 语句在PL/SQL中应该有INTO的模式啊。看你写触发器的样式好像对ORACLE有一定研究的啊。
    系统会给你提示
    PLS-00428: an INTO clause is expected in this SELECT statement
    PLS-00201: identifier 'username' must be declared
    PLS-00201: identifier 'sql_text' must be declared
    我是写PACKAGE的。对触发器的新用法不太了解,多多指教。
      

  5.   

    请问一下,v$open_cursor表示什么
      

  6.   

    snowy_howe(天下有雪)说的对:v$sql中包含所有的SQL操作,另外,v$session和v$sqltext也有相关的信息,但是,如何从触发器中知道当前操作的标识信息呢???
      

  7.   

    只能根据时间来确定,v$sql中有FIRST_LOAD_TIME字段存放执行的时间,
    试试看
      

  8.   

    我在触发器中用了下面的语句:
     
    SELECT SQL_TEXT from v$sql where FIRST_LOAD_TIME = SYSDATE;
    INSERT INTO temp(SQLTEXT)
    VALUES(SQL_TEXT);这样写对吗?
    编译有错误。