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!