Si un disparador DDL 'After' DDL causa un error, ¿el DDL está enrollado hacia atrás?
Pregunta
Eso ha sido sugerido Ese DDL se realiza lógicamente algo como esto:
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;
Lo que sugeriría que cualquier error en un desencadenante causaría que el DDL se vuelva hacia atrás. ¿Es este el caso?
Solución
La respuesta, al menos en 11.2, es "depende":
Este create
está enrollado hacia atrás:
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
*/
Pero esto truncate
no es:
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
*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange