我有一个任务涉及更新许多触发器,这些触发器是完全相同的查询,但应用于多个不同的表。有没有办法使用 FOR 或类似的语句来更新所有这些触发器?实际上我需要做的是修改所有这些触发器的 WHEN 子句。
最佳答案
您可以使用 dbms_metadat 来实现此目的。
例如:
declare
type arr_tab is table of varchar2(30);
v_arr arr_tab;
v_trig clob;
begin
dbms_metadata.set_transform_param( DBMS_METADATA.SESSION_TRANSFORM,
'SQLTERMINATOR', FALSE );
v_arr := arr_tab('TEST_TRIG', 'TEST2_TRIG'); -- change these triggers.
for idx in 1..v_arr.count
loop
v_trig := dbms_metadata.get_ddl('TRIGGER',v_arr(idx), user);
execute immediate regexp_replace(regexp_replace(v_trig, 'ALTER TRIGGER.*', ''), 'WHEN ([^\)]*\))', 'WHEN (1=1)', 1, 1, 'mi');
end loop;
end;
/
'WHEN ([^\)]*\))', 'WHEN (1=1)'
部分将 WHEN
子句替换为 (在我的例子中) 何时 (1=1)
。
关于oracle - 修改多个oracle触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652716/