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?
fonte
Respostas:
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.
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)
fonte
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
,DELETE
eINSERT
declarações em todos os ambientes.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ãoCOMMIT
. 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 oCOMMIT
.fonte
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.
fonte
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":
Leia mais sobre esse recurso aqui: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections
fonte
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.
fonte
Apenas mais duas dicas, já que não vejo nada parecido aqui:
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.)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 ON
ou 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.fonte
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.
fonte
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.
fonte
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.
fonte