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?

¿Fue útil?

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
scroll top