Salva Vidas! Set NOEXEC ON

Posted on março 11, 2011

6


 

Eu, Socorro (http://twitter.com/maryhelpa) e  Luti (http://luticm.blogspot.com/) estamos em um projeto, que realiza uma grande massa de importações para um banco de dados. Esse processo de importação já está estável e as importações ocorrem muito bem. Sendo assim toda a parte de acesso à dados está sendo realizada via Procedures e View’s, ou seja as coisas estão ficando bem bonitas !!!  .

Como temos que realizar testes  unitários em todas as procedures e view’s temos que ter um ambiente local parecido com o ambiente de produção.

Quer saber mais sobre testes unitários com o SQL Server, então veja no Blog do Luti, uma palestra bem legal sobre isso: http://luticm.blogspot.com/2011/01/conteudo-da-palestra-sobre-unit-test.html

Para isso usamos alguns script’s que realizam toda a criação da estrutura desse banco de dados,  inserções simples em algumas tabelas de lookup, mais a grande massa de dados importada, está somente no banco de dados de produção.

Então um grande medo surge em nossos pensamentos, imagine se sem querer nós executarmos esse script de criação do banco de dados no servidor de produção, será que o Luti ficará feliz? Acho que não….

Antes desse medo surgir, é claro que fomos alertados algumas “muitas” vezes pelo Luti, engraçado que 30 Minutos depois que ele fez esse alerta, ele executou esse script  2 vezes no banco de produção, apagando todos os dados…rsssss !! (Somos DBA’s é claro que temos backup pessoal….)

Depois desse acontecimento, pensamos em um solução de como restringir isso, não queremos que nínguem realize esse script  no banco de dados de produção, não queremos ver nossas tabelas sem dados no final das contas…

 

Então, depois de alguns minutos de pesquisa, descobrimos o comando SET NOEXEC ON, esse realmente foi um salva vidas em nossas vidas…..

 

BOL: “Comando SET NOEXEC  ON realiza a compilação dos comandos T-SQL mais não realiza a execução dos mesmos.”

Se antes de criarmos uma tabela no banco de dados, por exemplo, colocarmos SET NOEXEC ON, então o SQL SERVER irá realizar a compilação do código mais não irá criar de fato essa tabela.

 

Exemplo dessa funcionalidade:

Usando SET NOEXEC OFF, o SQL Server irá se comportar normalmente, então se realizarmos a criação de um tabela, ela terá que estar no banco de dados.

SET NOEXEC OFF

 

USE tempdb

GO

 

–Verificação da Tabela

IF OBJECT_ID(‘TesteDados’) IS NOT NULL

      DROP TABLE TesteDados

 

–Criação da Tabela

CREATE TABLE TesteDados

(

    ID INT IDENTITY(1,1),

    Nome VARCHAR(100),

)

 

–Visualizando a Tabela

SELECT  *

FROM sys.objects

WHERE type = ‘U’

AND name = ‘TesteDados’

image

Então de fato, temos a tabela criada,

Agora…

Usando SET NOEXEC ON, o SQL Server irá compilar o código, mais não irá realizar a criação de uma nova tabela.

SET NOEXEC ON

 

USE tempdb

GO

 

–Verificação da Tabela

IF OBJECT_ID(‘TesteDadosNOEXEC’) IS NOT NULL

      DROP TABLE TesteDadosNOEXEC

 

 

–Criação da Tabela

CREATE TABLE TesteDadosNOEXEC

(

    ID INT IDENTITY(1,1),

    Nome VARCHAR(100),

)

Agora abra uma nova consulta e execute o seguinte:

SELECT  *

FROM sys.objects

WHERE type = ‘U’

AND name = ‘TesteDadosNOEXEC’

image

Isso mesmo que estamos vendo, ele compilou o código, mais não realizou a criação da tabela, demais não?!!!

Então no final das contas, realizamos o seguinte código no começo dos scripts mais importantes.

IF (@@SERVERNAME = ‘SERVIDOR_DE_PRODUCAO’)

      SET NOEXEC ON

Sendo assim sempre que estivermos no servidor de produção e realizamos a execução do script de criação do banco de dados por exemplo, ele não fará nada.

 

Então sempre que precisar ter mais segurança e confiança em seus script’s, utilize o SALVA VIDAS SET NOEXEC ON… !!!

Marcado:
Posted in: Curiosidades