我想建立一个触发器,实现的功能是:
当我创建一个表时,触发器实现将表的一些信息(表名、表的列信息等)填入指定的某些表中,
我用的语句是: create or replace trigger t_table 
               after create on user.schema
               ......
我测试了一下,创建表时,确实可以将表的一些信息(表名、表的列信息等)填入指定的某些表中,但是当修改某个表的键信息等的时候(也就是凡是对数据库中的表进行某些修改以及函数、存储过程等做变动时,这个触发器就出问题了,它会阻碍对表、函数、存储过程的修改)请问各位,我该如何修改这个触发器??

解决方案 »

  1.   

    create   or   replace   trigger   t_table  
    after   create   on   user.schema 
    declare 
    v_create_time   date;
    v_object_name   varchar2(100);
    v_object_type   varchar2(20);
    v_error_code    number;
    v_error_msg     varchar2(512);
    begin
         select created,object_type,object_name into v_create_time,v_object_name,v_object_type from obj
     where created=sysdate;
         if v_object_type='TABLE' then
             --调用一个没有问题的package body;
          end if;
    end; 
      

  2.   

    修改的时候,应该是ALTER,不是create了。ora_dict_obj_name可以得到修改的对象名,你不用自己select的,你的select 语句很可能报错的。多条数据的错误。
      

  3.   

    察看Oracle的文档就会知道的。
    要学会用这个,赫赫。
      

  4.   

    ?还是不太明白啊~~  如果我单独创建某个新表时,trigger执行是没有任何问题的(我的最初目的已经达到了),次  此触发器带来了别的问题,如果我修改表结构或创建表的主外键、创建package body时,这个触发器也执行,并且
    会无法执行下去,因为这个触发器存在的原因~~
    能不能给我解释的更详细些? 
      

  5.   

    嗬嗬,看来你自己的程序,你自己都还没有搞清楚。赫赫。关键是你的触发的事件上面。
    你选择了create       on       user.schema   
    就是说,在user.schema上面,用到任何的create语句,都会触发这个触发器。不仅仅是表。但是,你用alter修改表的时候,不应该触发这个触发器的。
    创建表的主外键、创建package   body时都会触发。你的这个触发器,还有一个问题,就是我上面提到的,你用了select语句来找当天所有新建的对象,这个肯定会出错的。假如你一天创建了很多对象的时候。因为不唯一。
      

  6.   

    看看这个手册:
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#sthref7885
      

  7.   

    但是当修改某个表的键信息等的时候(也就是凡是对数据库中的表进行某些修改以及函数、存储过程等做变动时,这个触发器就出问题了,它会阻碍对表、函数、存储过程的修改)
    =========================================
    做这些修改时,报的什么错?
    在10g的oracle中,可以直接用ora_dict_obj_type得对象类型。10g以前用sys.dictionary_obj_type获得。