Wenn ein DDL -Auslöser von 'After' einen Fehler verursacht, wird die DDL zurückgerollt?
Frage
Es wurde empfohlen Dass DDL logisch wie folgt ausgeführt wird:
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;
Dies würde darauf hindeuten, dass ein Fehler in einem Auslöser dazu führen würde, dass die DDL zurückgerollt wird. Ist das der Fall?
Lösung
Die Antwort lautet mindestens 11.2, "es hängt davon ab":
Dies create
ist zurückgerollt:
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
*/
Aber dieses truncate
ist nicht:
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
*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange