Unix下Oracle8i中,编写实现如下功能的一个触发器,如何实现:
1、当对表A进行增删改操作时,触发它,拿出进行此操作的SQL语句,比如insert into a values('aaa',....),填写操作日志到Log表里。
2、当对表A进行增删改操作时,触发它,让它触发一个用C++编写的程序,可以传进参数最好。
在线等待!!!

解决方案 »

  1.   

    trigger下能传进参数????
    感觉好像在trigger下不能实现 
    帮你顶一下
      

  2.   

    可以实现
    但是通过审计功能觉得更简单一些
    搜索‘audit’
      

  3.   


    设一个表为test,
    SQL> desc test;
    Name Type         Nullable Default Comments 
    ---- ------------ -------- ------- -------- 
    AA   NUMBER(10)   Y                         
    BB   VARCHAR2(20) Y       可以用UTL_FILE包实现第一个功能,但是传入的参数有限,写入的log文件需要你整理一下:
    create or replace trigger tri_test
    before insert on test
    for each row
    declare 
    handle_file UTL_FILE.FILE_TYPE;
    buf_file VARCHAR2(100);  --没有用到
    begin
    handle_file :=UTL_FILE.FOPEN('F:\cn\','t.txt','w');
    SYS.UTL_FILE.PUT_LINE(handle_file,'First Line Log'||:new.aa);
    SYS.UTL_FILE.FCLOSE(handle_file);
    end;
    /
    注意UTL_FILE包的使用方法(在init.ora中设置目录权限等)。
      

  4.   

    Oracle9i我可以实现,8i中我找不到相关的函数
      

  5.   

    就是将'First Line Log'||:new.aa模拟成真正执行的SQL语句,写入文件,麻烦一些,但完全可以实现的。
      

  6.   

    因为解决方案的需要,这个触发器要适用于一切表,只在有权限,换一下表名就可以。UTl_FILE包是文件读写包吧,不知道能不能执行文件?如果可以执行文件,第二个问题倒是可以解决
      

  7.   

    是地,UTl_FILE包只是文件读写包,不能执行文件。
      

  8.   

    那这个包就用不着了,我不需要把它写到文件中,只要写到LOG表里面就可以了,这样也就少了权限这层的问题。
      

  9.   

    我不需要写到文件中,只要插入数据库中就可以了,所以这个包可以不用的,我有种方法可以在9i中真正地拿出SQL语句放到数据库中,适用于任何表,不过在8i中我没法实现,才拿出来问问各位同仁们,希望有哪位大哥给我一种在8i中使用的方法
      

  10.   

    我不需要写到文件中,只要插入数据库中就可以了,所以这个包可以不用的,我有种方法可以在9i中真正地拿出SQL语句放到数据库中,适用于任何表,不过在8i中我没法实现,才拿出来问问各位同仁们,希望有哪位大哥给我一种在8i中使用的方法
      

  11.   

    噢我看成log文件了,请问9i里怎么实现的呀?
      

  12.   

    比较麻烦,9i中有个函数可以返回一个数组,存着SQL语句中的各个元素,重组一下为个数组就可以了,很简单,叫dbm_sql_txt()
      

  13.   

    或者你可以对v$sql里面的sql_text字段进行分析
    这样是否会简单一些
      

  14.   

    · select user_name,sql_text
    ·    from v$open_cursor
    ·    where sid in (select sid from (select sid
    ·    from v$session
    ·    where status='ACTIVE'))用用上面这条语句,可能对你有帮助的,
    它能找出当前已经激活的sql语句,
    再查一下它的视图结构,可能对你有帮助。
      

  15.   

    楼上的兄弟,谢谢你,这段代码具有很高有价值,不过有一种情况,如果同时有N条SQl,同激活的话可能会有点问题,这个触发器并不是所有的表都有,两百张表中有四十多个表是有的,所以不可行
      

  16.   

    在ORACLE帮助中找到了一段说明,好像是说调用外部程序的:
    (偶看一下先)
    10
    External Procedures
    Well, if I called the wrong number, why did you answer the phone? James Thurber 
    PL/SQL is a powerful development tool; you can use it for almost any purpose. But, it is specialized for SQL transaction processing. So, some tasks are more quickly or easily done in a lower-level language such as C, which is more efficient at machine-precision calculations. For example, a Fast Fourier Transform (FFT) routine written in C runs faster than one written in PL/SQL. To support such special-purpose processing, PL/SQL provides an interface for calling routines written in other languages. This makes the strengths and capabilities of those languages available to you. No longer are you restricted to one language with its inherent limitations. 
    ......
      

  17.   

    不是没有好办法,在9i中,就可以在触发器中获得触发这个PL/SQL程序的SQL语句,有了这个语句,我就可以做个日志表,来装这些语句,再用外部程序监控着,有了数据就对这些数据进行处理,说白了吧,我所要做的功能有点像快照,不过是要把好多快照集成在一张表是,但如果定期全刷速度太慢,一个表就要好几个小时,所以我想只刷部分更新了的数据,有了这些SQL语句,拿到备份库里面执行一下就可以了,速度很快,安全性也好,不用全刷的时候万一不成功就掉数据了。
      

  18.   

    如何在PL/SQL用上C呢,谁能给我一点这方面的资料或方向
      

  19.   

    你可以看到Oracle的帮助文件吗?我刚才贴的就是在External Procedures那一章,说的是调用C程序的,当然如果是想C中嵌入SQL就是Pro*C了。另外你说的dbm_sql_txt()函数,我怎么找不到呀?不是dbms_sql那个包吧?
      

  20.   

    我所说的是oracle9i中的,在8i中没有,我也没找到这个包
      

  21.   

    up一下,看看有没有高手解答
    另外我是在9i的书上找的,没有那个函数,它是函数还是包的方法呀?