plsql get table in 'before alter' trigger

巧了我就是萌 提交于 2020-01-05 05:37:31

问题


I have a table ident, and I also have a table ident_hist, which just keeps a log from the table ident. The table ident gets altered a lot, so I want to add the new columns to ident_hist dynamically as well. I have created a procedure which does that:

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;

My question is, how can I check in my DDL trigger if I'm altering the tabel ident?

I want to do something like this:

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

When I try to compile the trigger, I get this error message:

ORA-30506: system triggers cannot be based on tables or views

How can I make my DDL trigger check if I'm altering my table ident? I only want to fire the trigger it when I'm altering the table ident, not any other table.


回答1:


30506, 00000, "system triggers cannot be based on tables or views"

Cause: An attempt was made to base a system trigger on a table or a view.
Action: Make sure the type of the trigger is compatible with the base object.

System triggers are not associated with individual objects. You can create DDL trigger before before create or alter or drop on SCHEMA(User/Owner). Then you can filter the object names and the DDL types(DROP, ALTER).

Here Tom has explained about this in detail. Writting DDL_EVENT Triggers



来源:https://stackoverflow.com/questions/40301599/plsql-get-table-in-before-alter-trigger

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!