Treinamento para consultas com SQL Server - Parte 9 - Medidas de Segurança Iniciais

O trabalho com bancos de dados muitas vezes será feito em ambiente de produção, embora se recomende que isso seja evitado ao máximo.

Com isto aumenta significativamente o risco de se executar alguma consulta de atualização dos dados que cause problemas. Um DELETE ou UPDATE sem WHERE, por exemplo, já é o suficiente para tirar o sono do desenvolvedor durante muito tempo.

Alguns bancos de dados mais antigos e portanto, há mais tempo no mercado, como o ORACLE, exigem em todas as suas ferramentas de DML que o COMMIT seja sempre explícito, ou seja, para as modificações tanto dos dados como da estrutura de tabelas serem persistidas a instrução deve conter esta instrução, caso contrário, os resultados estarão pendentes até fechar a sessão e no momento em que isso é feito, um ROLLBACK é executado automaticamente.

O SQL Server ainda não possui este recurso. Toda e qualquer consulta executada está no modo AUTO COMMIT. Assim, para evitar problemas causados por este tipo de configuração, este documento apresenta duas alternativas que visam prevenir problemas futuros. São elas:

  1. Executar consultas de DML dentro de um bloco BEGIN TRAN ... COMMIT | ROLLBACK
  2. Desabilitar o auto commit da ferramenta SSMS
Consulta com BEGIN TRAN | COMMIT/ROLLBACK

Basta simplesmente colocar as instruções envolvidas entre BEGIN TRAN e COMMIT ou ROLLBACK:

BEGIN TRAN
 <INSTRUÇÕES DML>
COMMIT; -- ou ROLLBACK

Vamos usar o exemplo da tabela DOCUMENTOS.FOLDERS

A consulta demonstrada a seguir insere quatro registros na tabela, imprime os resultados, faz o ROLLBACK da operação e um novo SELECT.

begin tran
 insert into documents.Folders (FolderId, ParentFolderId, Name)
 values (100, NULL, 'TREINAMENTO'),
        (101, 100, 'APOSTILAS'),
     (102, 100, 'BACKUPS'),
     (103, 100, 'AVALIAÇÕES');

 select *
 from documents.Folders
 where FolderId > 99;
rollback

select *
from documents.Folders
where FolderId > 99;

Esta consulta traz os resultados que podem ser conferidos na próxima figura, primeiro, como resultado da instrução SELECT dentro do bloco BEGN TRAN ... ROLLBACK, são exibidos os registros que foram inseridos. Fora do bloco, um novo SELECT é enviado e desta vez, nenhum registro é exibido.

Desabilitando o auto commit do SSMS

Executar as consultas dentro do bloco BEGIN TRAN ... COMMIT | ROLLBACK é apenas uma medida paliativa. Em um cenário adequado de configurações de acesso e permissões, o banco de dados deve ter um usuário específico para realizar operações DML, DDL e um apenas para executar consultas.

Este cenário é raro de encontrar. Assim, para evitar problemas, uma alternativa é desligar o AUTO COMMIT do SSMS (até o dia em que isso venha, como se espera, desligado por padrão). Para fazer isso no SSMS (em qualquer versão) acesse o menu Ferramentas > Opções. Na janela que se abre, expanda os itens Execução da Consulta > SQL Server > ANSI. Marque o campo SET IMPLICIT_TRANSACTIONS como representado na figura abaixo e reinicie o SSMS.

Ao executar qualquer consulta (inclusive de SELEÇÃO, infelizmente) será informado que existem transações pendentes quando for fechar a janela da consulta ou a aplicação e será solicitado uma confirmação para o COMMIT: