我想建立一个触发器,实现的功能是:
当我创建一个表时,触发器实现将表的一些信息(表名、表的列信息等)填入指定的某些表中,
我用的语句是: create or replace trigger t_table
after create on user.schema
......
我测试了一下,创建表时,确实可以将表的一些信息(表名、表的列信息等)填入指定的某些表中,但是当修改某个表的键信息等的时候(也就是凡是对数据库中的表进行某些修改以及函数、存储过程等做变动时,这个触发器就出问题了,它会阻碍对表、函数、存储过程的修改)请问各位,我该如何修改这个触发器??
当我创建一个表时,触发器实现将表的一些信息(表名、表的列信息等)填入指定的某些表中,
我用的语句是: create or replace trigger t_table
after create on user.schema
......
我测试了一下,创建表时,确实可以将表的一些信息(表名、表的列信息等)填入指定的某些表中,但是当修改某个表的键信息等的时候(也就是凡是对数据库中的表进行某些修改以及函数、存储过程等做变动时,这个触发器就出问题了,它会阻碍对表、函数、存储过程的修改)请问各位,我该如何修改这个触发器??
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;
要学会用这个,赫赫。
会无法执行下去,因为这个触发器存在的原因~~
能不能给我解释的更详细些?
你选择了create on user.schema
就是说,在user.schema上面,用到任何的create语句,都会触发这个触发器。不仅仅是表。但是,你用alter修改表的时候,不应该触发这个触发器的。
创建表的主外键、创建package body时都会触发。你的这个触发器,还有一个问题,就是我上面提到的,你用了select语句来找当天所有新建的对象,这个肯定会出错的。假如你一天创建了很多对象的时候。因为不唯一。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#sthref7885
=========================================
做这些修改时,报的什么错?
在10g的oracle中,可以直接用ora_dict_obj_type得对象类型。10g以前用sys.dictionary_obj_type获得。