Links Recomendados

sábado, 25 de agosto de 2012

Não execute uma Instrução DDL quando tiver Transação DML em andamento na sessão

Pode ser desastroso, pois ddls possuem commit implícito. Por esta razão , commit , rollback , savepoint não podem ser usados em ddls. Vamos fazer um teste.

-- criando a tabela t

9.2>create table t (data date) ;
Table created.

-- populando alguns dados na tabela

9.2>insert into t values (sysdate ) ;
1 row created.
9.2>insert into t values (sysdate + .04166);
1 row created.
9.2>insert into t values (sysdate + 2* (.04166) ) ;
1 row created.
9.2>select * from t ;

-- consultando
9.2>select * from t ;
DATA---------
17-DEC-08
17-DEC-08
17-DEC-08

--vamos colocar um inocente comentario na tabela

9.2>comment on table t is 'tabela para testar commit implicito';
Comment created.

--decidi que o insert não é mais necessário , então vou fazer um rollback

9.2>rollback;
Rollback complete.

-- consultando novamente a tabela não pode ter mais nada nela , certo?

9.2>select * from t ;
DATA---------
17-DEC-08
17-DEC-08
17-DEC-08


Apesar do rollback o commit foi efetuado pelo COMMENT. Qualquer ddl faz isto. Portanto muito cuidado. 
Via de Regra, se precisa fazer algum DDL , faça antes de iniciar uma transação -- SEMPRE --. O exemplo acima pode não ser comum, mas não é raro em triggers ter algum DDL chamado por um execute immediate, e neste caso a transação que disparou a trigger vai commitar implicitamente mesmo que mais adiante ocorra um erro.

Nenhum comentário:

Postar um comentário