Невозможно - вы не можете выдавать DDL как этот в триггере уровня строки.
[возможный комментарий к проблеме дизайна отредактирован, как указано]
Рассматривали ли вы распараллеливание вашего сценария? Вместо уборщика, который делает ставку на каскад удаления, вместо этого используйте DBMS_SCHEDULER для распараллеливания задания. Вы можете безопасно выполнять параллельное удаление для таблиц на одном уровне дерева зависимостей.
begin
dbms_scheduler.create_program
(program_name => 'snapshot_purge_cases',
program_type => 'PLSQL_BLOCK',
program_action =>
'BEGIN
delete from purge$Case;
insert into purge$Case
select CaseId
from Case
where deleteFlag = 1;
delete from purge$Opt;
insert into purge$Opt
select OptId
from OptimizationRun
where CaseId in (select CaseId from purge$Case);
delete from purge$Step;
insert into purge$Step
select StepId
from OptimizationStep
where OptId in (select OptId from purge$Opt);
commit;
END;',
enabled => true,
comments => 'Program to snapshot keys for purging';
);
dbms_scheduler.create_program
(program_name => 'purge_case',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
loop
delete from Case
where CaseId in (select Case from purge$Case)
where rownum <= 50000;
exit when sql%rowcount = 0;
commit;
end loop;
commit;
END;',
enabled => true,
comments => 'Program to purge the Case Table'
);
-- repeat for each table being purged
end;
/
Это только настроить программы. Что нам нужно сделать дальше, так это создать цепочку работы, чтобы мы могли собрать их вместе.
BEGIN
dbms_scheduler.create_chain
(chain_name => 'purge_case_chain');
END;
/
Теперь мы делаем шаги в цепочке заданий, используя программы из предыдущих версий:
BEGIN
dbms_scheduler.define_chain_step
(chain_name => 'purge_case_chain',
step_name => 'step_snapshot_purge_cases',
program_name => 'snapshot_purge_cases'
);
dbms_scheduler.define_chain_step
(chain_name => 'purge_case_chain',
step_name => 'step_purge_cases',
program_name => 'purge_case'
);
-- repeat for every table
END;
/
Теперь мы должны связать шаги цепи вместе. Задания распадутся, вот так:
- Снимок
CaseIds
, OptIds
и StepIds
для очистки.
- Очистить все таблицы в зависимости от
OptimizationStep.
- Очистить все таблицы в зависимости от
OptimizationRun.
- Очистить все таблицы в зависимости от
Case.
- Очистка
Case.
Таким образом, код будет:
begin
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'TRUE',
action => 'START step_snapshot_purge_cases',
rule_name => 'rule_snapshot_purge_cases'
);
-- repeat for every table dependent on OptimizationStep
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'step_snapshot_purge_cases COMPLETED',
action => 'START step_purge_TwoDDataY2',
rule_name => 'rule_purge_TwoDDataY2'
);
-- repeat for every table dependent on OptimizationRun
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'step_purge_TwoDDataY2 COMPLETED and
step_purge_ThreeDDataZ COMPLETED and
... ',
action => 'START step_purge_OnedDataX',
rule_name => 'rule_purge_OnedDataX'
);
-- repeat for every table dependent on Case
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'step_purge_OneDDataX COMPLETED and
step_purge_TwoDDataY1 COMPLETED and
... ',
action => 'START step_purge_Files',
rule_name => 'rule_purge_Files'
);
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'step_purge_Files COMPLETED and
step_purge_OptimizationRun COMPLETED and
... ',
action => 'START step_purge_Case',
rule_name => 'rule_purge_Case'
);
-- add a rule to end the chain
dbms_scheduler.define_chain_rule
(chain_name => 'purge_case_chain',
condition => 'step_purge_Case COMPLETED',
action => 'END',
rule_name => 'rule_purge_Case'
);
end;
/
Включить цепочку заданий:
BEGIN
DBMS_SCHEDULER.enable ('purge_case_chain');
END;
/
Вы можете запустить цепочку вручную:
BEGIN
DBMS_SCHEDULER.RUN_CHAIN
(chain_name => 'chain_purge_case',
job_name => 'chain_purge_case_run'
);
END;
/
Или создайте задание, чтобы запланировать это:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'job_purge_case',
job_type => 'CHAIN',
job_action => 'chain_purge_case',
repeat_interval => 'freq=daily',
start_date => ...
end_date => ...
enabled => TRUE);
END;
/