我正在一个庞大的数据库上执行存档过程,它涉及删除生产活动表并将另一个表重命名为新的生产表.删除生产活动表时,触发器也会被删除.所以我只是使用select*from all_triggers来备份我的表上定义的触发器,其中table_name = mytablename; 我的问题是,在将其他表重命名为新的生产活动表后,是否可以直接将这些触发器复制到all_triggers表中?触发器仍然有效吗?定义索引和约束的问题也一样.
不,你不能直接操纵数据字典表.您不能直接插入数据all_triggers(对于任何数据字典表都是如此).我想你可能会给予足够的黑客攻击.它只是不起作用,会使您的数据库不受支持.
正确的方法是编写触发器脚本并稍后重新应用它们.如果要以编程方式执行此操作,则可以使用该dbms_metadata程序包.如果你想为表上的每个触发器获取DDL,你可以做类似的事情
select dbms_metadata.get_ddl( 'TRIGGER', t.trigger_name, t.owner )
from all_triggers t
where table_owner = <<owner of table>>
and table_name = <<name of table>>
Run Code Online (Sandbox Code Playgroud)
将触发器从一个表复制到另一个表可以通过复制DDL而不是更新all_triggers表来完成.这可以通过使用来完成DBMS_METADATA.
我在这里找到的最接近的实际示例:复制表时复制触发器
可以根据需要修改以下脚本:
declare
p_src_tbl varchar2(30):= 'PERSONS'; --your table name
p_trg_tbl varchar2(30):= 'PSN2'; --your trigger name
l_ddl varchar2(32000);
begin
execute immediate 'create table '||p_trg_tbl||' as select * from '||p_src_tbl||' where 1=2';
for trg in (select trigger_name from user_triggers where table_name = p_src_tbl) loop
l_ddl:= cast(replace(replace(dbms_metadata.get_ddl( 'TRIGGER', trg.trigger_name),p_src_tbl,p_trg_tbl),trg.trigger_name,substr(p_trg_tbl||trg.trigger_name, 1, 30)) as varchar2);
execute immediate substr(l_ddl, 1, instr(l_ddl,'ALTER TRIGGER')-1);
end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)