Wie kann ich das Risiko einer versehentlichen Änderung der falschen Datenbank minimieren?

12

Ich habe gerade gelernt, dass das Trennen der Verbindung zu einem Server im Objekt-Explorer Sie nicht daran hindert, Abfragefenster auszuführen, die auf diesem Server bereits geöffnet waren.

Meine Situation sieht folgendermaßen aus: Ich verwende eine Instanz von SSMS, um eine Verbindung zu unserem Entwicklungs- / Staging-Server und zu unserem Produktionsserver herzustellen. Ich musste eine Reihe von Daten auf dev löschen, damit ich dachte, ich sollte meine Verbindung zur Produktion schließen, aber ich habe nicht auf das Abfragefenster geachtet, das ich verwendete. (Zum Glück hatten wir ein Backup von nur ein paar Stunden.)

Ich bin nicht der Erste, der Produktionsdaten zerstört, und ich bin nicht der Letzte, dessen ich mir sicher bin. Daher suche ich nach Checklisten, Best Practices usw., mit denen Sie das Risiko minimieren können, dass Abfragen in der falschen Datenbank ausgeführt werden. Ist Ihnen das schon einmal passiert, und wie haben Sie Ihren Workflow angepasst, um dies zu vermeiden?

Stijn
quelle
4
Achte darauf, was du tust.
Swasheck
Mein SQL-Tool (nicht SSMS) ermöglicht es mir, einen "Nur-Lese-Modus" zu aktivieren, der einfach alle Anweisungen ablehnt, die möglicherweise die Datenbank ändern könnten.
a_horse_with_no_name
Holen Sie sich genug Schlaf und Bewegung, mehr Aufmerksamkeit.

Antworten:

11

Eine Sache, die ich in SSMS gerne mache, ist die Verwendung von benutzerdefinierten Farben beim Herstellen einer Verbindung zur Datenbank. Sie wählen also ein schönes helles Rot für Live-Datenbanken und ein sanftes Blau oder Grün für Entwickler- oder Testsysteme. Früher habe ich das eingebaute SSMS verwendet, heutzutage bevorzuge ich die SSMS Tools Addon-Farbcodierung.

So was

Oder wie folgt für SSMS Tools (Ein wirklich nettes Addon, und ich finde die Farbe besser, wenn sie oben ist, anstatt unten wie die eingebaute) Oder dieses

Mikey Mouse
quelle
2
+1 Das ist was ich tue. Verwenden Sie Rot für die Produktion, Gelb für Testumgebungen und Grün für meine lokale Entwicklungsdatenbank. Die alte Ampel-Metapher funktioniert hier gut.
LeopardSkinPillBoxHat
6

Je nachdem , wen man fragt, wird es ein wenig mehr Arbeit erfordern, aber ich habe die Gewohnheit , immer die folgenden Anweisung für alle Produktions- oder Vorproduktion Abfragefenster, und für alle UPDATE, DELETEund INSERTAussagen in allen Umgebungen.

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

Wenn ich das sehe, werde ich sofort wissen, "Ups, das Abfragefenster war noch verbunden" oder "Oh Mist, ich habe automatisch etwas getan, was ich nicht haben sollte" - und ja, Sie können die Datenbank im Objekt-Explorer schließen, aber ein Abfragefenster kann weiterhin verbunden werden. Meiner Meinung nach sollten alle Produktionsabfragen hervorgehoben und mit ausgeführt werden BEGIN TRAN. Ein versehentliches F5 auf alles, sollte alles zurückrollen, nichtCOMMIT . Dies zwingt den Benutzer, sich seiner Handlungen bewusst zu werden. Ähnlich wie das Aufnehmen eines Fotos von jeder Mahlzeit, die Sie essen, hilft Ihnen beim Abnehmen, da Sie innehalten und überlegen müssen, was Sie tun.

Dauert das länger? Ja. Stoppt es 100% der Fehler? Ja, denn es wird nie etwas festgeschrieben, es sei denn, ich erzwinge manuell das COMMITSchreiben des Postens, was mich aufgrund der Natur des Postens gezwungen hat, das zu berücksichtigen COMMIT.

Question3CPO
quelle
4
Ich predige auch über diese Praxis (und dies ist eine weitere Funktion von SSMS Tools Pack - mit der Sie die Vorlage für neue Abfragen anpassen können), aber Sie müssen auf das umgekehrte Szenario achten - Sie markieren BEGIN TRAN und die Abfrage, vergessen jedoch, die auszuführen COMMIT oder ROLLBACK, dann pfeifen, wenn Sie das Gebäude zum Mittagessen, am Wochenende oder für ein 6-monatiges Sabbatical verlassen.
Aaron Bertrand
6

Erstellen Sie ein zweites Benutzerkonto für Produktionsänderungen und widerrufen Sie den Zugriff, den Ihr Konto derzeit hat. Wenn Sie in der Produktion arbeiten möchten, können Sie ssms als zweiten Benutzer ausführen.

EDIT: Dies wäre nur bei Domain-Logins von Vorteil. Wenn Sie zwei separate Domänenkonten hätten, wären Sie gezwungen, separate Instanzen von SSMS für DEV und PROD zu haben. Wenn Sie keine Domain-Konten verwenden, hilft Ihnen dieser Vorschlag nicht wirklich weiter.

Wenn Sie separate Domänenkonten verwenden, können Sie auch die SSMS-Farbeinstellungen pro Benutzer anpassen. Möglicherweise hat das Konto, das eine Verbindung zu PROD herstellt, einen leuchtend roten Hintergrund.

Dies ist auch ein gutes Whitepaper : http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

Es werden Dinge besprochen, wie beispielsweise, Ihrem täglichen Anmeldekonto keinen vollständigen SA-Zugriff zu gewähren.

Mark Wilkinson
quelle
Sie meinen, das würde irgendwie den Zugriff auf mehr als einen Server von einer einzelnen SSMS-Instanz aus deaktivieren? Oder was habe ich vermisst?
Andriy M
Wir verwenden bereits verschiedene Benutzerkonten. Ich verstehe nicht wirklich, wie das hilft.
Stijn
1
Ich denke, dies würde nur dann wirklich zutreffen, wenn Sie Domänenkonten verwenden. Wenn dies der Fall wäre oder Sie zwingen würde, eine separate Instanz von SSMS für Ihre DEV- und PROD-Verbindungen zu verwenden. Vielleicht schreibe ich ein SSMS-Add-In, das in diesem Szenario hilfreich ist. Vielleicht wird eine Warnung angezeigt, wenn Sie versuchen, Code auf Ihrer Produktionsverbindung auszuführen ...
Mark Wilkinson
Oof, sorry für alle Tippfehler im Kommentar. Antwort am frühen Morgen per Handy ... aber Sie haben die Idee. :)
Mark Wilkinson
Ja, ich habe den Kern Ihrer Antwort verstanden :) Vielleicht können Sie Ihren Kommentar in Ihre Antwort einarbeiten?
Stijn
4

Schauen Sie sich mein Add-In an: SSMSBoost. Es hat genau das, was Sie brauchen. Ich habe die Farbfunktion der SSMS-Statusleiste verbessert, sodass sie Ihre aktuelle Datenbank nachverfolgt und ihre Farbe ändert. Zusätzlich können Sie den schwebenden Tooltip "Wichtige DB-Warnung" hinzufügen:

Bildbeschreibung hier eingeben

Weitere Informationen zu dieser Funktion finden Sie hier: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections

Andrei Rantsevich
quelle
2

In einem meiner Jobs haben wir dafür ein Tool entwickelt.

Wenn Sie eine Anweisung zu PROD ausführen wollten, mussten Sie Folgendes schreiben:

run_sql servername PROD <file_with_sqlstatements>.sql

Es würde die Ergebnisse in eine Protokolldatei schreiben und die Ausführung in ein Protokoll in unserer Verwaltungsdatenbank einfügen. Es war zum Beispiel sehr praktisch, wenn wir herausfinden wollten, wer als letzter einen bestimmten Tisch gewechselt hat.

Wenn Sie in SSMS Server registriert haben, können Sie einer Verbindung eine bestimmte Farbe zuweisen, sodass beispielsweise alle PROD-Verbindungen unten eine rote Farbe haben. Verwenden Sie GUI-Tools jedoch möglichst nicht auf einem Produktionsserver.

Funkelt
quelle
Ich verwende SSMS nur auf meinem Computer, toller Tipp zur Farbe der Verbindungszeichenfolge.
Stijn
3
Beachten Sie, dass die integrierte Farbfunktion nicht in allen Szenarien funktioniert. Dies hängt davon ab, wie Sie das Abfragefenster öffnen. Viel zuverlässiger (aber nicht kostenlos für SSMS 2012+) ist das SSMS Tools Pack . Mladen hat gerade eine 2014-kompatible Version veröffentlicht.
Aaron Bertrand
@Aaron das Tool sieht sehr interessant aus, ich schaue mir die Testversion an, danke!
Stijn
4
Eine andere, alternative Farblösung gibt es in SQL Prompt, die zwar nicht kostenlos ist, aber ein hübsches kleines Teil des Kits ist. Dadurch werden die Registerkarten oben und nicht nur unten gefärbt, wie dies bei SSMS der Fall ist.
Mark Sinkinson
1

Nur noch zwei Tipps, da ich hier schon nichts Ähnliches sehe:

  1. In meinem Workflow arbeite ich oft mit mehreren Anweisungen in einem einzigen Fenster und bin es gewohnt, Text auszuwählen und dann auszuführen. Aber ich habe immer Angst, versehentlich F5 zu drücken, wenn kein Text ausgewählt ist, und als Ergebnis alle Anweisungen in einem Fenster auszuführen. Jedes Mal, wenn ich ein neues Fenster öffne, beginne ich mit der Eingabe von Garbage SQL, das sich nicht kompilieren lässt. Dies macht den gesamten Stapel effektiv nicht ausführbar. (Achtung! Wenn Sie mehrere durch getrennte GOStapel verwenden, ist pro Stapel Müll erforderlich.)

  2. Bei Datenänderungen auf dem Produktionsserver (oder wenn ich äußerste Sorgfalt benötige) sind implizite Transaktionen sehr nützlich (entweder Sie SET IMPLICIT_TRANSACTIONS ONoder Sie ändern eine Option in SSMS, sodass die Option für jedes neue Fenster wirksam wird). Auf diese Weise startet jede Anweisung, die nicht in der Transaktion ist, eine neue Transaktion. Ich verpflichte mich nur, wenn ich zweimal sicher bin, dass ich das getan habe, was ich beabsichtigt hatte.

Kuba Wyrostek
quelle
0

Verwenden Sie einen separaten Windows-Benutzer, der als einziger die Produktionsdatenbank konfiguriert hat. Setzen Sie das gesamte Farbschema dieses Benutzers auf Rot. Bei schnellem Benutzerwechsel sollte dies kein Problem sein.

Verwenden Sie die Produktionsanmeldeinformationen niemals in einem Konto, das sich auf einem Entwicklungscomputer befindet. Eine kurze Telefon- oder Mitarbeiterfrage und danach löschen Sie gerne alles für Ihren neuen Testlauf ...

Eine andere Option (dieselbe Idee) ist die Verwendung eines Remote-Desktops oder einer virtuellen Maschine mit einem anderen Thema.

awsm
quelle
0

Eine andere Möglichkeit, die Ausführung aller Elemente im Abfragefenster zu verhindern, wenn F5 gedrückt wird, besteht darin, den gesamten Inhalt mit / * und * / zu umgeben und so das Ganze zu einem Kommentar zu machen.

Sie können die gewünschten Anweisungen weiterhin ausführen, indem Sie sie markieren und wie gewohnt F5 drücken, obwohl sie in einem Kommentar enthalten sind.

Hinweis: Wenn Sie diese Methode wählen, können Sie die Syntaxhervorhebung oder die automatische Vervollständigung nicht nutzen. Wenn Sie diese Funktionen jedoch nicht so häufig verwenden, ist es möglicherweise sinnvoll, sie zu opfern, um sicherzustellen, dass sie zu 100% unbeschädigt sind die Datenbank mit einem versehentlichen F5.

Bearbeiten: Sie können / * * / auch nicht im gesamten Abfragefenster verwenden, da Sie sonst versehentlich nachfolgenden Code auskommentieren. Halten Sie sich stattdessen an die - -Notation.

ps.pf
quelle
-1

In Übereinstimmung mit dem Kommentar von swasheck zur ursprünglichen Frage, wie wäre es mit der Ausführung ...

Wählen Sie @@ Servername + '\' + @@ Servername

... bevor Sie eine DML ausführen oder in der Statusleiste nachsehen, mit welcher Instanz Sie verbunden sind, oder sogar die gesamte DML in einer Transaktion ausführen, damit Sie ein Rollback durchführen können, wenn Sie feststellen, dass Sie einen Fehler gemacht haben? Viele großartige Vorschläge, aber im Grunde werden Gimmicks, wenn es um potenziell destruktives DML geht, Sie nur so weit bringen. Ich überprüfe, überprüfe und überprüfe immer wieder. Und wenn ich mit einer kleinen Datenmenge zu tun habe, kann ich sogar vor der DML IN eine neue Tabelle AUSWÄHLEN, meine DML ausführen, einige Vergleiche durchführen, um sicherzustellen, dass die Dinge richtig funktionierten, und dann die "Backup" -Tabelle löschen. Arbeite schlauer, nicht härter.

John Chase
quelle