plsql在改变之前获取表格#39;触发

时间:2016-10-28 09:02:04

标签: oracle plsql triggers ddl alter

我有一个表ident,我还有一个表ident_hist,它只保存表ident的日志。表标识被大量更改,所以我想动态地将新列添加到ident_hist。我已经创建了一个程序:

create or replace procedure prc_create_hist_tabel(p_naam_hist_tabel in varchar2, p_naam_tabel in varchar2) is
cursor c is 
    select 'alter table ' || p_naam_hist_tabel || ' add ' || column_name || ' ' || data_type || case when data_type = 'DATE' then null else '(' || data_length || ')' end lijn 
    from user_tab_columns 
    where TABLE_NAME = upper(p_naam_tabel) 
    and column_name not in (select column_name from user_tab_columns where table_name = upper(p_naam_hist_tabel));

    v_dummy number(1);
begin
    begin
        select 1 into v_dummy
        from user_tab_columns
        where TABLE_NAME = upper(p_naam_hist_tabel)
        group by 1;
    exception when no_data_found then
        execute immediate 'create table ' || p_naam_hist_tabel || ' (wijziger varchar2(60) default user, wijzigdatum date default sysdate, constraint pk_' || p_naam_hist_tabel || ' primary key (wijziger, wijzigdatum))';
    end;

    for i in c
    loop
        execute immediate i.lijn;
    end loop;
end;

我的问题是,如果我改变表格标识,我如何检查我的DDL触发器?

我想做这样的事情:

create or replace trigger ident_hist_trig before alter on ident
begin
    prc_create_hist_tabel('ident_hist', 'ident');
end;

当我尝试编译触发器时,收到此错误消息:

  

ORA-30506:系统触发器不能基于表或视图

如果我改变我的表格身份,如何检查我的DDL触发器?我只想在改变表格身份时触发它,而不是任何其他表格。

1 个答案:

答案 0 :(得分:1)

  

30506,00000,“系统触发器不能基于表格或视图”

     

原因:尝试将系统触发器基于表或a               视图。
  操作:确保触发器的类型与基座兼容               对象

系统触发器与单个对象无关。 您可以在创建或更改之前创建DDL触发器,或者在SCHEMA(用户/所有者)上删除。然后,您可以过滤对象名称和DDL类型(DROP,ALTER)。

汤姆已经详细​​解释了这一点。 Writting DDL_EVENT Triggers