Transações envolvendo DDL no SQL Server 2005

Por Reydeval Rocha

 

 

Olá pessoal!!!

 

Hoje trataremos de um tema muito interessante: transações envolvendo instruções DDL – Data Definition Language.

 

Introdução

 

Sabemos que transações são unidades lógicas de trabalho, ou seja, todas as instruções que compõem o bloco são efetivadas ou nenhuma delas é efetivada. Esse conceito garante a consistência e integridade dos dados. O interessante é que no SQL Server as transações não funcionam apenas com instruções DML, mas também com instruções DDL. Vejamos os exemplos abaixo que ilustram a utilização de transações envolvendo comandos DDL.

 

Usando transações com DDL

 

--CENARIO1-------------------------------------------------

--Transação com instruções DDL

--A instrução insert causa erro de integridade referencial,

--acarretando em rollback em TODAS as instruções.

-----------------------------------------------------------

begin tran

 

     create table tb_mae(codigo     int identity,

                        campo1    char(1))    

 

 

      alter table tb_mae add constraint pk_mae primary key(codigo) 

 

      create table tb_filha( codigo    int identity,

                             campo1  char(1),

                             mae        int)   

 

      alter table tb_filha add constraint pk_filha primary key(codigo)     

 

      insert into tb_filha(campo1,mae)

            values ('S',1)

 

      alter table tb_filha add constraint fk_mae_filha

            foreign key(mae) references tb_mae(codigo)  

 

      if @@error <> 0

         rollback tran

      else

         commit

 

select * from tb_mae

 

Observem a mensagem ao executar os selects acima:

Msg 208, Level 16, State 1, Line 1

Invalid object name 'tb_mae'.

Isso significa que o SQL Server fez um rollback nas instruções anteriores, inclusive, nos creates table.

 

--CENARIO2-------------------------------------------------

--Transação com instruções DDL

--A instrução insert não causa erro de integridade referencial,

--acarretando em commit na transação.

-----------------------------------------------------------

drop table tb_mae

drop table tb_filha

 

begin tran

 

    create table tb_mae(codigo      int identity,

                        campo1             char(1))    

 

 

      alter table tb_mae add constraint pk_mae primary key(codigo)

 

      insert into tb_mae(campo1)

            values ('A')        

 

      create table tb_filha( codigo int identity,

                             campo1    char(1),

                             mae       int)     

 

      alter table tb_filha add constraint pk_filha primary key(codigo)         

 

      alter table tb_filha add constraint fk_mae_filha

            foreign key(mae) references tb_mae(codigo)

 

      insert into tb_filha(campo1,mae)

            values ('S',1)    

 

      if @@error <> 0

         rollback tran

      else

         commit

 

 

Conclusão

 

Mostramos de rápida que é possível utilizar transações com instruções DDL da mesma forma que se utiliza transações com instruções DML. Até o próximo artigo!