Como posso minimizar o risco de modificar acidentalmente o banco de dados errado?

12

Acabei de aprender da maneira mais difícil que desconectar de um servidor no Pesquisador de Objetos não impede você de executar janelas de consulta que já estavam abertas nesse servidor.

Minha situação é a seguinte: eu tenho uma instância do SSMS que eu uso para conectar ao nosso servidor de desenvolvimento / teste e ao nosso servidor de produção. Eu tive que excluir um monte de dados no dev, então achei que deveria fechar minha conexão com a produção, mas não prestei atenção na janela de consulta que estava usando. (Felizmente, tivemos um backup de apenas algumas horas).

Não sou a primeira pessoa a destruir dados de produção e não serei a última a ter certeza. Por isso, estou procurando listas de verificação, práticas recomendadas etc. que ajudem a minimizar o risco de executar consultas no banco de dados errado. Você já teve isso com você antes e como você adaptou seu fluxo de trabalho para evitar isso?

Stijn
fonte
4
preste atenção no que você está fazendo.
swasheck
Minha ferramenta SQL (não o SSMS) permite ativar um "modo somente leitura" que simplesmente rejeita qualquer declaração que possa potencialmente alterar o banco de dados.
A_horse_with_no_name 23/05
Durma o suficiente e se exercite, preste mais atenção.

Respostas:

11

Uma coisa que gosto de fazer no SSMS é usar cores personalizadas ao conectar ao banco de dados. Portanto, você escolhe um bom vermelho brilhante para os bancos de dados ao vivo e um azul ou verde suave para sistemas de desenvolvimento ou teste. Eu costumava usar o SSMS embutido, mas hoje em dia eu prefiro o código de cores do SSMS Tools Addon.

Como isso

Ou assim, para as Ferramentas SSMS (um complemento muito bom, e acho a cor melhor quando está no topo, em vez de na parte inferior, como na parte interna) Ou isto

Mikey Mouse
fonte
2
+1 É o que eu faço. Use vermelho para produção, amarelo para ambientes de teste e verde para meu banco de dados de desenvolvimento local. A velha metáfora do semáforo funciona bem aqui.
LeopardSkinPillBoxHat
6

Dependendo de quem você perguntar, ele vai exigir um pouco mais de trabalho, mas eu tenho o hábito de sempre usando o abaixo de instrução para todas as janelas de consulta de produção ou de pré-produção, e para todos UPDATE, DELETEe INSERTdeclarações em todos os ambientes.

BEGIN TRAN
-- END OF QUERY WINDOWS
ROLLBACK TRAN
PRINT 'Transaction rolled back.'

Se eu vir isso, saberei imediatamente: "Ops, essa janela de consulta ainda estava conectada" ou "Ah, merda, eu fiz algo que não deveria ter feito" - e sim, você pode fechar o banco de dados no Pesquisador de Objetos, mas um janela de consulta ainda pode ser conectada. Na minha opinião, todas as consultas de produção devem ser destacadas e executadas com BEGIN TRAN; um F5 acidental em tudo, deve reverter tudo, não COMMIT. O que isso faz é forçar o usuário a estar consciente de suas ações; semelhante a tirar uma foto de cada refeição que você come ajuda a perder peso, porque você deve parar e pensar no que está fazendo.

Demora mais tempo para fazer? Sim. Para 100% dos erros. Sim, porque nada é confirmado, a menos que eu force manualmente o COMMIT, pós digitando, o que a própria natureza de me forçou a considerar o COMMIT.

Question3CPO
fonte
4
Eu também prego sobre essa prática (e é outro recurso do SSMS Tools Pack - que permite personalizar o modelo New Query), mas você deve ter cuidado com o cenário oposto - você destaca BEGIN TRAN e a consulta, mas esquece de executar o COMMIT ou ROLLBACK, depois assobie ao sair do prédio para o almoço, o fim de semana ou um período sabático de 6 meses.
Aaron Bertrand
6

Crie uma segunda conta de usuário para alterações de produção e revogue o acesso que sua conta possui atualmente. Quando você quer fazer coisas em produção, pode executar ssms como o segundo usuário.

EDIT: Isso só seria benéfico no caso de logons de domínio. Se você tivesse duas contas de domínio separadas, seria forçado a ter instâncias separadas do SSMS para DEV e PROD. Se você não estiver usando contas de domínio, essa sugestão não ajudará muito.

Além disso, se você estiver usando contas de domínio separadas, poderá ajustar as configurações de cores do SSMS por usuário, talvez com um fundo vermelho brilhante para a conta que se conecta ao PROD.

Aqui está um bom white paper que também veio à mente: http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

Ele discute coisas como não dar acesso total à SA à sua conta de login diária.

Mark Wilkinson
fonte
Você quer dizer que de alguma forma desabilitaria o acesso a mais de um servidor a partir de uma única instância do SSMS? Ou o que eu perdi?
Andriy M
Já estamos usando contas de usuário diferentes. Não vejo realmente como isso ajuda.
Stijn
1
Acho que isso só se aplicaria se você estivesse usando contas de domínio. Se esse fosse o caso, ou forçaria você a usar uma instância separada, se o SSMS para suas conexões DEV e PROD. Talvez eu escrevi um SSMS add-in que ajuda com este cenário, talvez surgindo um aviso sempre que você tenta executar o código na sua conexão de produção ...
Mark Wilkinson
Oof, desculpe por todos os erros de digitação no comentário. Resposta de manhã cedo via celular ... mas você entendeu. :)
Mark Wilkinson
Sim, eu entendi a essência da sua resposta :) Talvez você possa inserir seu comentário na sua resposta?
Stijn
4

Dê uma olhada no meu suplemento: SSMSBoost. Tem exatamente o que você precisa. Eu aprimorei o recurso de coloração da barra de status do SSMS para rastrear seu banco de dados atual e alterar sua cor. Além disso, você pode adicionar a dica de ferramenta flutuante "alerta importante ao banco de dados":

insira a descrição da imagem aqui

Leia mais sobre esse recurso aqui: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections

Andrei Rantsevich
fonte
2

Em um dos meus trabalhos, desenvolvemos uma ferramenta para esse fim.

Se você quisesse executar uma declaração no PROD, forçou-o a escrever:

run_sql servername PROD <file_with_sqlstatements>.sql

Ele gravaria os resultados em um arquivo de log e acrescentaria a execução a um log em nosso banco de dados de gerenciamento. Foi muito útil, por exemplo, quando queríamos descobrir quem era a última pessoa a mudar uma determinada mesa.

No SSMS, quando você possui servidores registrados, pode aplicar uma determinada cor a uma conexão, para que, por exemplo, todas as conexões PROD tenham uma cor vermelha na parte inferior. Mas é melhor evitar o uso de ferramentas da GUI em um servidor de produção, se possível.

Twinkles
fonte
Estou executando o SSMS apenas na minha máquina, ótima dica sobre a cor da cadeia de conexão.
Stijn
3
@Stijn observe que o recurso de cores interno não funciona em todos os cenários - depende de como você abre a janela de consulta. Um que é muito mais confiável (mas não é gratuito no SSMS 2012+) é o SSMS Tools Pack . Mladen acaba de lançar uma versão compatível com 2014.
Aaron Bertrand
@ Aaron a ferramenta parece muito interessante, vou dar uma olhada na versão de teste, obrigado!
Stijn
4
Outra solução de coloração alternativa está no SQL Prompt , que, embora não seja gratuito, é um kit muito bacana. Isso colore as guias na parte superior, e não apenas na parte inferior, como o SSMS.
Mark Sinkinson
1

Apenas mais duas dicas, já que não vejo nada parecido aqui:

  1. No meu fluxo de trabalho, muitas vezes trabalho com várias instruções em uma única janela e estou bastante acostumado a selecionar o fluxo de texto e execução. Mas sempre tenho medo de pressionar F5 acidentalmente quando nenhum texto é selecionado e executar todas as instruções em uma janela como resultado. Então, toda vez que abro uma nova janela, começo digitando qualquer lixo que o SQL se recuse a compilar. Isso efetivamente torna o lote inteiro não executável. (Aviso! Se você usar vários lotes separados GO, o lixo será necessário por lote.)

  2. Ao fazer alterações de dados no servidor de produção (ou sempre que preciso de extremo cuidado) - as transações implícitas são muito úteis (você SET IMPLICIT_TRANSACTIONS ONou altera uma opção no SSMS para que a opção seja eficaz para cada nova janela). Dessa forma, toda declaração que não está em transação - inicia uma nova transação. Só comprometo se tiver certeza de que fiz duas vezes o que pretendia.

Kuba Wyrostek
fonte
0

Tente usar um usuário separado do Windows, que é o único que possui o banco de dados de produção configurado. Defina o tema de cores inteiras deste usuário para vermelho. Com a troca rápida de usuários, isso não deve ser problema.

Nunca use as credenciais de produção em uma conta que esteja em uma máquina de desenvolvimento. Uma breve pergunta por telefone ou colega de trabalho e, depois, você está felizmente excluindo tudo para o seu novo teste ...

Outra opção (mesma idéia) é usar uma área de trabalho remota ou uma máquina virtul com um tema diferente.

awsm
fonte
0

Outra maneira bastante direta de impedir a execução de tudo na janela de consulta quando F5 é pressionado seria cercar todo o conteúdo com / * e * /, tornando assim tudo um comentário.

Você ainda pode executar as instruções que deseja destacando-as e pressionando F5 da maneira usual, mesmo que elas estejam incluídas em um comentário.

Nota: se você escolher esse método, não poderá se beneficiar do realce da sintaxe ou do preenchimento automático, mas se não usar muito esses recursos, poderá valer a pena sacrificá-los para garantir que seja 100% impossível danificar o banco de dados com um F5 acidental.

Editar: você também não poderá usar / * * / em qualquer lugar da janela de consulta, caso contrário, inadvertidamente, removerá o comentário do código subsequente. Precisa ficar com a notação - em vez disso.

ps.pf
fonte
-1

De acordo com o comentário do swasheck sobre a pergunta original, que tal executar ...

selecione @@ servername + '\' + @@ servicename

... antes de executar qualquer DML, ou mesmo olhar a barra de status para ver em qual instância você está conectado, ou até mesmo executar todo o DML em uma transação para que você possa reverter se perceber que cometeu um erro? Muitas ótimas sugestões aqui, mas basicamente, quando se trata de DML potencialmente destrutivo, truques só o levarão até agora. Eu sempre checo, checo e checo novamente. E se eu estiver lidando com uma pequena quantidade de dados, talvez eu até SELECIONE EM uma nova tabela antes do DML, execute meu DML, faça algumas comparações para garantir que as coisas funcionem corretamente e solte a tabela "backup". Trabalhe com mais inteligência, não mais.

John Chase
fonte