Если «после» триггера 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