触发器是针对insert,update,delete的,你的要求不可以使用触发器实现。

解决方案 »

  1.   

    不好意思,看错了,看成insert了。嘿嘿
      

  2.   

    nicholaz(欲上青天揽明月) :
    差点误人子弟!:)
      

  3.   

    不行吧,我就是需要用自己定义的安全策略加在你说的那些方法之上,
    所以才需要获得这个访问,现在就是没办法控制,oracle 有这样的接口吗
      

  4.   

    因为我现在做的程序要求这样,你有没办法实时获得select的信息,包括
    操作者,操作对象,操作对象的owner等。
    我要用操作者的信息与对象的信息进行比较,
      

  5.   

    这是因为大家都想死死挖掘oracle的东西
      

  6.   

    select 实现trigge功能是可以的!比如要关注那些人查询过那些数据!方法:
    使用 view 来代替表
    在view中用一个函数来表示  列
    在这个函数中使用  自治事务 (pragma定义)
    在这个事务中完成你想要做的操作
      

  7.   

    大虾是不是说用触发器实现oracle的内部审计?
    但这是在需要非常详细的审计信息时用的。
      

  8.   

    需要解释清楚的是:这个实现方式跟 trigger 没有关系!create view ........  select funcA() a,... from xxx........在该函数 FuncA 中:
    因为在函数中本身是不能有dml操作的,但我们可以这样实现,参考下面的 存储过程的实现
    SQL> select * from test1;A B
    ---------- --------------------
    1 1
    3 3
    2 2SQL> 
    SQL> CREATE or replace PROCEDURE insert_test 
    2 as
    3 PRAGMA AUTONOMOUS_TRANSACTION;
    4 BEGIN
    5 insert into test1 values(6,6);
    6 rollback;
    7 END;
    8 /过程已创建。SQL> begin
    2 insert into test1 values(5,5);
    3 insert_test;
    4 commit;
    5 end;
    6 /PL/SQL 过程已成功完成。SQL> select * from test1;A B
    ---------- --------------------
    1 1
    3 3
    2 2
    5 5SQL>这样在函数中可以进行dml操作并提交或者回退
    然后前台查询的人的信息于是被保留在了数据库中
      

  9.   

    原来是这样的。我还以为触发器真的能对select触发呢!
      

  10.   

    如果您直接用 select 语句肯定不行,
    但是您可以用 update your_table set your_col=your_col where your_condition return into your_variable;
    这样,你既可以得倒 select 出来的数据,还能在此句话上触发触发器事件。
      

  11.   

    biti_rainy,你说的方法是说在建立视图时引用自己编写的函数吗?
    那么,岂不是在对视图进行任何操作的时候都会调用这个函数,而不只select.
    我如下做了,发现在操作视图时自治的那个事务被执行了好多遍:
    create or replace procedure sqltct
    as
       pragma  autonomous_transaction;
    begin 
      insert into number_test
      values(7,'wo');
      commit;
    end;
    create or replace function sel_check(name in varchar2)
    return varchar2
    is
    begin
       sqltct;
       return name;
    end;
    create view v_teacher(name,id)
    as
    select sel_check(name),id from teacher;结果:
    select * from v_teacher;
    得到返回结果后
    在select * from number_test;
    得到的结果中有14行“7 wo”,为什么执行了一个select却在number_test
    中插入了14行呢
      

  12.   

    这个问题又涉及到另外一个问题了那就是你对这个视图的操作
    可以建立 instead of trigger  处理dml
    并且,在函数中要判断,发现是select (或者满足你所期望的条件的时候)才做这个操作,是dml(不满足条件的时候) 则不执行这个自制事务
    当然,这种要求除非是对那种高度机密的信息追踪记录
    做起来比较麻烦
      

  13.   

    呵呵,如果不select funcA()这一列就无法记录了.
    建议还是用audit.