TRIGGER:CREATE OR REPLACE TRIGGER MING_AFTER_QTY
  AFTER update OR DELETE OR INSERT on SAJET.SYS_PROCESS
  FOR EACH ROW
declare
  -- local variables here
begin
  
  INSERT INTO  HT_LIST
   SELECT L.SQL_TEXT, S.*
   FROM V$SQL L, V$SESSION S 
        WHERE UPPER(L.SQL_TEXT) LIKE 'UPDATE%'
              AND S.SQL_ADDRESS = L.ADDRESS;        
end  MING_AFTER_QTY;意思是当有UPDATE语句时就把做这条语句的session记录到HT_LIST中。事实上,测试时UPDATE语句在V$SQL中能看到,但是一部能在HT_LIST记录下来,有些却不能(换成BEFORE类型也一样)。为什么?

解决方案 »

  1.   

    --TRIGGER:CREATE OR REPLACE TRIGGER MING_AFTER_QTY
      AFTER update on SAJET.SYS_PROCESS
      FOR EACH ROW
    declare
      -- local variables here
    begin
     
      INSERT INTO  HT_LIST
      SELECT L.SQL_TEXT, S.*
      FROM V$SQL L, V$SESSION S
            WHERE UPPER(L.SQL_TEXT) LIKE 'UPDATE%'
                  AND S.SQL_ADDRESS = L.ADDRESS;       
    end  MING_AFTER_QTY; 
      

  2.   

    CREATE OR REPLACE TRIGGER MING_AFTER_QTY 
      AFTER update OR DELETE OR INSERT on SAJET.SYS_PROCESS 
      FOR EACH ROW 
    declare 
      -- local variables here 
    begin 
      
      INSERT INTO  HT_LIST 
      SELECT L.SQL_TEXT, S.* 
      FROM V$SQL L, V$SESSION S 
            WHERE (UPPER(L.SQL_TEXT) LIKE 'UPDATE%' or 
                   UPPER(L.SQL_TEXT) LIKE 'DELETE%' or 
                   UPPER(L.SQL_TEXT) LIKE 'INSERT%')
                  AND S.SQL_ADDRESS = L.ADDRESS;        
    end  MING_AFTER_QTY; 
      

  3.   

    你的这个不应该使用行级触发器,应该使用语句级触发器:
    CREATE OR REPLACE TRIGGER MING_AFTER_QTY
      AFTER UPDATE OR DELETE OR INSERT ON SAJET.SYS_PROCESS
    BEGIN
      INSERT INTO HT_LIST
        SELECT L.SQL_TEXT, S.*
          FROM V$SQL L, V$SESSION S
         WHERE UPPER(L.SQL_TEXT) LIKE 'UPDATE%SYS_PROCESS%'
           AND S.sid=SYS_CONTEXT('userenv', 'sid')
           AND l.HASH_VALUE IN (s.SQL_HASH_VALUE,s.PREV_HASH_VALUE);
    END MING_AFTER_QTY;
    /--其实这样也未必会选出正确的数据,应该把更新数据的字段内容放到 like中,更准确
      

  4.   

     AFTER update OR DELETE OR INSERT on SAJET.SYS_PROCESS 
    --表示,在更改,删除,插入  SAJET.SYS_PROCESS 这个表的任一行时触发这个触发器。
    FOR EACH ROW--行级触发器