Jak mogę zminimalizować ryzyko przypadkowej modyfikacji niewłaściwej bazy danych?

12

Właśnie dowiedziałem się na własnej skórze, że rozłączenie się z serwerem w Eksploratorze obiektów nie powstrzymuje cię później przed uruchomieniem okien zapytań, które były już otwarte na tym serwerze.

Moja sytuacja wygląda następująco: mam jedno wystąpienie SSMS, którego używam do łączenia się z naszym serwerem deweloperskim / pomostowym i serwerem produkcyjnym. Musiałem usunąć wiele danych z dev, więc pomyślałem, że powinienem zamknąć połączenie z produkcją, ale nie zwróciłem uwagi na okno zapytań, którego używałem. (Na szczęście mieliśmy kopię zapasową sprzed zaledwie kilku godzin.)

Nie jestem pierwszą osobą, która niszczy dane produkcyjne i nie będę ostatnią, jestem tego pewien. Szukam więc list kontrolnych, najlepszych praktyk itp., Które pomogą zminimalizować ryzyko wykonywania zapytań w niewłaściwej bazie danych. Czy zdarzyło Ci się to wcześniej i jak dostosowałeś przepływ pracy, aby tego uniknąć?

Stijn
źródło
4
zwracaj uwagę na to, co robisz.
swasheck
Moje narzędzie SQL (nie SSMS) pozwala mi włączyć „tryb tylko do odczytu”, który po prostu odrzuca wszelkie instrukcje, które mogłyby potencjalnie zmienić bazę danych.
a_horse_w_no_name
Wyśpij się i ćwicz, zwracaj większą uwagę.

Odpowiedzi:

11

Jedną z rzeczy, które lubię robić w SSMS, jest używanie kolorów niestandardowych podczas łączenia się z bazą danych. Więc wybierasz ładną, jasnoczerwoną bazę danych Live i delikatną niebieską lub zieloną dla systemów deweloperskich lub testowych. Kiedyś korzystałem z wbudowanego SSMS, ale obecnie wolę kodowanie kolorami narzędzi SSMS Addon.

Lubię to

Lub tak jak w przypadku Narzędzi SSMS (Naprawdę fajny dodatek, i znajduję kolor lepiej, gdy jest na górze, niż na dole, jak wbudowany) Albo to

Mikey Mouse
źródło
2
+1 To właśnie robię. Użyj czerwonego do produkcji, żółtego do środowisk testowych i zielonego do mojej lokalnej bazy danych programistycznych. Stara metafora sygnalizacji świetlnej działa tutaj dobrze.
LeopardSkinPillBoxHat
6

W zależności od tego, kogo zapytasz, będzie to wymagało trochę więcej pracy, ale mam w zwyczaju zawsze używając poniżej zestawienia dla wszystkich okien zapytań produkcyjnych lub pre-produkcji, a dla wszystkich UPDATE, DELETEi INSERToświadczenia we wszystkich środowiskach.

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

Jeśli to zobaczę, od razu będę wiedział: „Ups, okno kwerendy było nadal podłączone” lub „O cholera, automatycznie zrobiłem coś, czego nie powinienem” - i tak, możesz zamknąć bazę danych w eksploratorze obiektów, ale okno zapytania może być nadal połączone. Moim zdaniem wszystkie zapytania produkcyjne powinny być wyróżnione i uruchomione BEGIN TRAN; przypadkowy F5 na wszystkim, powinien wszystko przewrócić, a nie COMMIT. To powoduje, że użytkownik musi być świadomy swoich działań; podobnie jak robienie zdjęć każdemu jedzonemu posiłkowi pomoże ci schudnąć, ponieważ musisz przestać myśleć o tym, co robisz.

Czy to trwa dłużej? Tak. Czy zatrzymuje 100% błędów. Tak, ponieważ nic się nigdy nie popełnia, chyba że ręcznie wymuszę COMMITwpis, wpisując go, co sama natura zmusi mnie do rozważenia COMMIT.

Pytanie3CPO
źródło
4
Głoszę także o tej praktyce (i jest to kolejna funkcja pakietu narzędzi SSMS - umożliwiająca dostosowanie szablonu nowego zapytania), ale musisz uważać na przeciwny scenariusz - wyróżniasz POCZĄTEK TRAN i zapytanie, ale zapomnij uruchomić ZAANGAŻUJ SIĘ lub ROLLBACK, a następnie gwizdaj wychodząc z budynku na lunch, weekend lub 6-miesięczny urlop.
Aaron Bertrand
6

Utwórz drugie konto użytkownika dla zmian produkcyjnych i odwołaj dostęp, który aktualnie ma twoje konto. Jeśli chcesz robić rzeczy w produkcji, możesz uruchomić ssms jako drugi użytkownik.

EDYCJA: Byłoby to korzystne tylko w przypadku logowania do domeny. Jeśli masz dwa oddzielne konta domeny, będziesz zmuszony mieć osobne instancje SSMS dla DEV i PROD. Jeśli nie korzystasz z kont domeny, ta sugestia nie bardzo by Ci pomogła.

Ponadto, jeśli korzystasz z oddzielnych kont domeny, możesz dostosować ustawienia kolorów SSMS dla każdego użytkownika, być może mając jasne czerwone tło dla konta, które łączy się z PROD.

Oto dobra biała księga, która przyszła mi do głowy: http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

Omówiono takie rzeczy, jak nieprzyznawanie codziennego konta logowania pełnego dostępu SA.

Mark Wilkinson
źródło
Masz na myśli, że w jakiś sposób uniemożliwiłoby dostęp do więcej niż jednego serwera z jednej instancji SSMS? A co przegapiłem?
Andriy M
Używamy już różnych kont użytkowników, tak naprawdę nie widzę, jak to pomaga.
Stijn
1
Myślę, że tak naprawdę miałoby to zastosowanie tylko w przypadku korzystania z kont domeny. Gdyby tak było lub zmusiłoby cię do użycia oddzielnej instancji, jeśli SSMS dla połączeń DEV i PROD. Może napiszę dodatek SSMS, który pomaga w tym scenariuszu, może wyskakuje ostrzeżenie za każdym razem, gdy próbujesz uruchomić kod na połączeniu produkcyjnym ...
Mark Wilkinson
O, przepraszam za wszystkie literówki w komentarzu. Wczesna poranna odpowiedź przez telefon komórkowy ... ale masz pomysł. :)
Mark Wilkinson
Tak, dostałem sedno twojej odpowiedzi :) Być może możesz wprowadzić swój komentarz do swojej odpowiedzi?
Stijn
4

Zobacz mój dodatek: SSMSBoost. Ma dokładnie to, czego potrzebujesz. Ulepszyłem funkcję kolorowania paska stanu SSMS, dzięki czemu śledzi twoją bieżącą bazę danych i zmienia jej kolor. Dodatkowo możesz dodać pływającą etykietkę „ważny alert DB”:

wprowadź opis zdjęcia tutaj

Przeczytaj więcej o tej funkcji tutaj: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections

Andrei Rantsevich
źródło
2

W jednym z moich zadań opracowaliśmy narzędzie do tego celu.

Jeśli chcesz uruchomić instrukcję na PROD, zmusza cię to do napisania:

run_sql servername PROD <file_with_sqlstatements>.sql

Zapisuje wyniki w pliku dziennika i dołącza wykonanie do dziennika w naszej bazie danych zarządzania. Przydało się to na przykład, gdy chcieliśmy dowiedzieć się, kto był ostatnią osobą, która zmieniła określony stół.

W SSMS, gdy masz zarejestrowane serwery, możesz zastosować określony kolor do połączenia, aby na przykład wszystkie połączenia PROD miały kolor czerwony u dołu. Ale najlepiej, jeśli to możliwe, unikać używania narzędzi GUI na serwerze produkcyjnym.

Migoczą
źródło
Używam SSMS tylko na moim komputerze, świetna wskazówka dotycząca koloru ciągu połączenia.
Stijn
3
@Stijn zauważa, że ​​wbudowana funkcja koloru nie działa we wszystkich scenariuszach - zależy od sposobu otwarcia okna zapytania. Jednym z bardziej niezawodnych (ale nie darmowych w SSMS 2012+) jest pakiet narzędzi SSMS . Mladen właśnie wydał wersję zgodną z 2014 r.
Aaron Bertrand
@Aaron narzędzie wygląda bardzo interesująco, przyjrzę się wersji próbnej, dzięki!
Stijn
4
Innym alternatywnym rozwiązaniem do kolorowania jest SQL Monit, który, choć nie jest darmowy, jest całkiem sprytnym zestawem. Barwi to zakładki u góry, a nie tylko u dołu, co robi SSMS.
Mark Sinkinson
1

Jeszcze dwie wskazówki, ponieważ nie widzę tu już nic podobnego:

  1. W moim przepływie pracy często pracuję z wieloma instrukcjami w jednym oknie i jestem dość przyzwyczajony do wybierania tekstu i uruchamiania. Ale zawsze boję się przypadkowego naciśnięcia klawisza F5, gdy żaden tekst nie jest zaznaczony, i w rezultacie wykonuję wszystkie instrukcje w oknie. Tak więc za każdym razem, gdy otwieram nowe okno, zaczynam od wpisywania śmieciowego SQL, który odmówi kompilacji. To skutecznie powoduje, że cała partia nie jest wykonywalna. (Uwaga! Jeśli używasz wielu partii oddzielonych, GOśmieci są wymagane na partię).

  2. Podczas dokonywania zmian danych na serwerze produkcyjnym (lub za każdym razem, gdy potrzebuję szczególnej uwagi) - transakcje niejawne są bardzo przydatne (albo SET IMPLICIT_TRANSACTIONS ONzmieniasz opcję w SSMS, aby opcja była skuteczna dla każdego nowego okna). W ten sposób każde wyciągi, które nie są w transakcji - rozpoczynają nową transakcję. Popełniam tylko, jeśli dwa razy upewnię się, że zrobiłem to, co zamierzałem.

Kuba Wyrostek
źródło
0

Spróbuj użyć oddzielnego użytkownika systemu Windows, który jako jedyny ma skonfigurowaną produkcyjną bazę danych. Ustaw cały motyw kolorystyczny tego użytkownika na czerwony. Przy szybkiej zmianie użytkownika nie powinno to stanowić problemu.

Nigdy nie używaj poświadczeń produkcyjnych na koncie na komputerze programistycznym. Krótkie pytanie telefoniczne lub pytanie do współpracownika, a następnie z radością usuwasz wszystko dla nowego testu ...

Inną opcją (ten sam pomysł) jest użycie zdalnego pulpitu lub maszyny virtul z innym motywem.

awsm
źródło
0

Innym dość prostym sposobem zapobiegania wykonywaniu wszystkiego w oknie zapytania po naciśnięciu F5 byłoby otoczenie całej zawartości / * i * /, czyniąc z tego komentarz.

Nadal możesz wykonać żądane instrukcje, podświetlając je i naciskając F5 w zwykły sposób, nawet jeśli są one zawarte w komentarzu.

Uwaga: jeśli wybierzesz tę metodę, nie będziesz mógł skorzystać z podświetlania składni lub autouzupełniania, ale jeśli nie użyjesz tych funkcji aż tak bardzo, warto poświęcić je, aby upewnić się, że uszkodzenie jest w 100% niemożliwe baza danych z przypadkowym klawiszem F5.

Edycja: nie będziesz mógł używać / * * / nigdzie w oknie zapytania, w przeciwnym razie nieumyślnie odkomentujesz kolejny kod. Zamiast tego należy trzymać się notacji.

ps.pf
źródło
-1

W zgodzie z komentarzem swasheck do pierwotnego pytania, co powiesz na wykonanie ...

wybierz @@ nazwa serwera + '\' + @@ nazwa usługi

... przed uruchomieniem dowolnego DML, a nawet spojrzeniem na pasek stanu, aby zobaczyć, z którą instancją jesteś połączony, a nawet uruchomieniem całego DML w transakcji, abyś mógł cofnąć, jeśli zauważysz, że popełniłeś błąd? Wiele świetnych sugestii tutaj, ale w zasadzie, jeśli chodzi o potencjalnie destrukcyjny DML, sztuczki doprowadzą cię tylko do tej pory. Zawsze sprawdzam, sprawdzam dwukrotnie i sprawdzam ponownie. A jeśli mam do czynienia z niewielką ilością danych, mogę nawet WYBRAĆ nową tabelę przed DML, uruchomić mój DML, dokonać porównań, aby upewnić się, że wszystko działa poprawnie, a następnie upuścić tabelę „kopii zapasowej”. Pracuj mądrzej, nie ciężej.

John Chase
źródło