create table GGBA03A
(
  GGBA03A010 VARCHAR2(36),
  GGBA03A020 VARCHAR2(36),
  GGBA03A030 VARCHAR2(50),
  GGBA03A040 VARCHAR2(50),
  GGBA03A050 VARCHAR2(50),
  GGBA03A060 NUMBER(3) not null,
  PRIMARY KEY(GGBA03A060)
)我建了一个基于DATABASE的触发器,拦截alter表事件create or replace trigger tri_test_db
  after ALTER on DATABASE
Begin   insert into GGBA03A
      (GGBA03A010, GGBA03A020, GGBA03A030, GGBA03A040, GGBA03A050)
    values
      (sys.sysevent,
       sys.dictionary_obj_type,
       sys.dictionary_obj_name,
       (select count(a.column_name)
           from user_tab_cols a
          where a.table_name = sys.dictionary_obj_name),
       (select sysdate from dual));End;这时有个问题,如果是 alter table test add (sex varchar2(2)); 时,
得到的 count(a.column_name) 列数是添加之前的,而在修改列名和删除列名时,得到的列数又是实时的。
有没有达人遇到过类似问题!

解决方案 »

  1.   

    已经测试过。Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    如下的代码,把你的user_tab_columns改成了dba_tab_columns没有问题,都是之前的column的数目。 你再仔细查查。create or replace trigger tri_test_db
      after ALTER on DATABASE
    declare
    v number;
    begin
    dbms_output.put_line('Event type:'||sys.sysevent);
    dbms_output.put_line('Object type:'||sys.dictionary_obj_type);
    dbms_output.put_line('Object name:'||sys.dictionary_obj_name);
    select count(a.column_name) into v from dba_tab_cols a where a.table_name
    =sys.dictionary_obj_name;
    dbms_output.put_line('Columns:'||v);
    end;
    /
      

  2.   

    也就是说,每次我添加的最新的一列,在执行触发器中通过 user_tab_cols 视图,是获取不到最新添加的那一列。
    比如说一张表原先有2列,现在添加了4列,理论上应该是6列,但触发器中通过 user_tab_cols 视图查询出来的只有5列。如何获取最新添加的列?
      

  3.   


    修改了一下上面的,改成
    select count(a.column_name) into v from dba_tab_cols a where a.table_name=sys.dictionary_obj_name and owner=user;不过测试,update是不变的,delete确实是删除以后的column的个数。刚才我自己看错了。
      

  4.   

    这个可能做一下sql trace才知道哟。确实和我们想的不一样。
      

  5.   

    谢谢,我看能不能通过v$session获取到