「後」のDDLトリガーがエラーを引き起こす場合、DDLはロールバックされますか?

dba.stackexchange https://dba.stackexchange.com/questions/9700

  •  16-10-2019
  •  | 
  •  

質問

それ 提案されています そのDDLは論理的にこのようなものを実行します:

begin
    COMMIT;
    perform any appropriate pre-DDL trigger code;
    do the ddl;
    perform any appropriate post-DDL trigger code;
    COMMIT;
exception
    when others then
         ROLLBACK;
         raise;
end;

これは、トリガーのエラーがDDLをロールバックすることを示唆しています。これはそうですか?

役に立ちましたか?

解決

少なくとも11.2の答えは「依存する」です:

これ create ロールバックされます:

create trigger trig_foo after create on schema
begin
  raise_application_error(-20001, 'Dont do it!');
end;
/
--
create table foo as select level as id from dual connect by level<=10000;
/*
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Dont do it!
*/
--
select count(*) from foo;
/*
SQL Error: ORA-00942: table or view does not exist
*/

でも、これ truncate ではありません:

create table foo as select level as id from dual connect by level<=10000;
--
create trigger trig_foo after truncate on schema
begin
  raise_application_error(-20001, 'Dont do it!');
end;
/
--
truncate table foo;
/*
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Dont do it!
*/
select count(*) from foo;
/*
COUNT(*)               
---------------------- 
0                  
*/
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top