실수로 잘못된 데이터베이스를 수정하는 위험을 최소화하려면 어떻게해야합니까?


12

방금 Object Explorer에서 서버와의 연결을 끊어도 서버에서 이미 열려있는 쿼리 창을 실행하지 못하게하는 어려운 방법을 배웠습니다.

내 상황은 다음과 같습니다. Dev / Staging 서버와 프로덕션 서버에 연결하는 데 사용하는 SSMS 인스턴스가 하나 있습니다. 개발에서 많은 데이터를 삭제해야했기 때문에 프로덕션과의 연결을 닫아야한다고 생각했지만 사용중인 쿼리 창에주의를 기울이지 않았습니다. (행운 적으로 우리는 몇 시간 만 백업했습니다.)

나는 생산 데이터를 파괴 한 최초의 사람이 아니며, 내가 마지막으로 확신하지는 않을 것이다. 따라서 잘못된 데이터베이스에서 쿼리를 실행할 위험을 최소화하는 데 도움이되는 체크리스트, 모범 사례 등을 찾고 있습니다. 전에 이런 일이 있었습니까? 이것을 피하기 위해 워크 플로를 어떻게 조정 했습니까?


4
하고있는 일에주의를 기울이십시오.
swasheck

SSMS가 아닌 내 SQL 도구를 사용하면 데이터베이스를 변경할 수있는 문을 거부하는 "읽기 전용 모드"를 설정할 수 있습니다.
a_horse_with_no_name

충분한 수면과 운동을하고 더 많은주의를 기울이십시오.

답변:


11

SSMS에서 내가 좋아하는 한 가지는 데이터베이스에 연결할 때 사용자 지정 색을 사용하는 것입니다. 따라서 라이브 데이터베이스에는 밝은 빨강을, 개발 또는 테스트 시스템에는 파랑 또는 녹색을 선택하십시오. 나는 내장 SSMS를 사용했지만 요즘에는 SSMS Tools Addon Color 코딩을 선호합니다.

이렇게

또는 SSMS 도구의 경우 이와 같습니다 (정말 좋은 애드온이며 내장 된 것처럼 맨 아래가 아닌 맨 위에있을 때 색상이 더 좋습니다) 아니면 이거


2
+1 이것이 내가하는 일입니다. 프로덕션 환경에는 빨간색, 테스트 환경에는 노란색, 로컬 개발 데이터베이스에는 녹색을 사용하십시오. 오래된 신호등 은유는 여기서 잘 작동합니다.
LeopardSkinPillBoxHat

6

당신이 물어 사람에 따라, 좀 더 많은 작업이 필요합니다,하지만 난 항상을 위해 문 아래를 사용하는 습관을 가지고 모든 모든 생산 또는 사전 제작 쿼리 창 및 UPDATE, DELETEINSERT모든 환경에서 문.

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

이 메시지가 표시되면 "죄송합니다. 해당 쿼리 창이 여전히 연결되어 있습니다"또는 "아아 아아아, 내가 가지고 있지 않은 것을 자동으로 수행했습니다"라는 것을 즉시 알 수 있습니다. 예, 개체 탐색기에서 데이터베이스를 닫을 수는 있지만 쿼리 창을 계속 연결할 수 있습니다. 내 생각에 모든 프로덕션 쿼리는 강조 표시되고 BEGIN TRAN; 우발적 인 F5는 모든 것이 아니라 모든 것을 롤백해야합니다 COMMIT. 이것이하는 일은 사용자가 자신의 행동을 의식하도록 강요하는 것입니다. 먹는 모든 식사의 사진을 찍는 것과 마찬가지로 체중 감량에 도움이됩니다.

시간이 더 걸리나요? 예. 100 % 오류를 중지합니까? 예, 수동으로 강제로 COMMIT입력 하지 않으면 입력 한 후 커밋하는 것이 없기 때문에 본질 상 COMMIT.


4
나는이 연습에 대해서도 설교하고 SSMS 도구 팩의 또 다른 기능-새 쿼리 템플릿을 사용자 정의 할 수 있음) 반대 시나리오에주의해야합니다-BEGIN TRAN과 쿼리를 강조 표시하지만 실행을 잊어 버립니다. 커밋 또는 롤백 한 다음 점심, 주말 또는 6 개월의 안식년을 위해 건물을 떠날 때 호루라기.
Aaron Bertrand

6

프로덕션 변경을위한 두 번째 사용자 계정을 만들고 현재 계정에 대한 액세스 권한을 취소하십시오. 프로덕션 환경에서 작업을 수행하려는 경우 두 번째 사용자로 ssms를 실행할 수 있습니다.

편집 : 이것은 도메인 로그인의 경우에만 유용합니다. 별도의 도메인 계정이 두 개인 경우 DEV 및 PROD에 대해 별도의 SSMS 인스턴스가 있어야합니다. 도메인 계정을 사용하지 않는 경우이 제안이 실제로 도움이되지는 않습니다.

또한 별도의 도메인 계정을 사용하는 경우 사용자 당 SSMS 색상 설정을 조정할 수 있습니다 (PROD에 연결된 계정의 밝은 빨간색 배경).

다음은 좋은 백서입니다. http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

일일 로그인 계정에 전체 SA 액세스 권한을 부여하지 않는 것과 같은 사항에 대해 설명합니다.


단일 SSMS 인스턴스에서 둘 이상의 서버에 대한 액세스를 어떻게 비활성화 할 수 있습니까? 아니면 내가 무엇을 놓쳤습니까?
Andriy M

우리는 이미 다른 사용자 계정을 사용하고 있는데, 이것이 어떻게 도움이되는지 모르겠습니다.
Stijn

1
도메인 계정을 사용하는 경우에만 적용됩니다. 이 경우 또는 DEV 및 PROD 연결에 SSMS 인 경우 별도의 인스턴스를 사용해야합니다. 이 시나리오에 도움이되는 SSMS 애드 인을 작성했을 수도 있습니다. 프로덕션 연결에서 코드를 실행할 때마다 경고 메시지가 표시 될 수도 있습니다.
Mark Wilkinson

코멘트의 모든 오타가 유감입니다. 휴대 전화를 통한 이른 아침 응답 ... 아이디어를 얻습니다. :)
Mark Wilkinson

네, 나는 당신의 대답의 요점을 얻었습니다.
Stijn


2

내 직업 중 하나에서 우리는이 목적을위한 도구를 개발했습니다.

PROD에서 명령문을 실행하려면 다음과 같이 작성해야합니다.

run_sql servername PROD <file_with_sqlstatements>.sql

결과를 로그 파일에 기록하고 관리 데이터베이스의 로그에 실행을 추가합니다. 예를 들어 특정 테이블을 변경 한 마지막 사람이 누구인지 알고 싶을 때 매우 편리했습니다.

SSMS에서 서버를 등록하면 연결에 특정 색상을 적용하여 모든 PROD 연결이 맨 아래에 빨간색으로 표시되도록 할 수 있습니다. 그러나 가능하면 프로덕션 서버에서 GUI 도구를 사용하지 않는 것이 가장 좋습니다.


내 컴퓨터에서만 SSMS를 실행하고 있습니다. 연결 문자열의 색상에 대한 훌륭한 팁입니다.
Stijn

3
@Stijn은 내장 색상 기능이 모든 시나리오에서 작동하지는 않는다는 것을 참고하십시오-쿼리 창을 여는 방법에 따라 다릅니다. SSMS 2012+에서는 훨씬 안정적이지만 SSMS Tools Pack 은 무료입니다 . Mladen은 2014 년 호환 버전을 출시했습니다.
Aaron Bertrand

@Aaron 도구가 매우 흥미로워 보입니다. 시험판을 살펴 보겠습니다. 감사합니다!
Stijn

4
또 다른 대체 착색 솔루션은 SQL Prompt에 있으며, 무료는 아니지만 아주 멋진 키트입니다. 이렇게하면 SSMS가 수행하는 맨 아래가 아니라 맨 위의 탭에 색상이 표시됩니다.
Mark Sinkinson

1

이미 여기에 비슷한 것이 보이지 않기 때문에 두 가지 팁이 더 있습니다.

  1. 작업 과정에서 종종 단일 창에서 여러 문으로 작업하며 텍스트를 선택한 다음 흐름을 선택하는 데 많이 사용됩니다. 그러나 텍스트를 선택하지 않았을 때 실수로 F5를 누르고 결과적으로 창에서 모든 명령문을 실행하는 것이 항상 두려워합니다. 따라서 새 창을 열 때마다 가비지 SQL이 컴파일을 거부하는 모든 것을 입력하는 것으로 시작합니다. 이렇게하면 전체 배치를 효과적으로 실행할 수 없습니다. (경고! 여러 개의 배치를 분리하여 사용하는 경우 배치 GO당 가비지가 필요합니다.)

  2. 프로덕션 서버에서 데이터를 변경하거나 극도의주의가 필요할 때마다-암시 적 트랜잭션은 매우 유용합니다 ( SET IMPLICIT_TRANSACTIONS ONSSMS에서 옵션을 변경하거나 새 창마다 적용 할 수 있도록 옵션을 변경). 이런 식으로 트랜잭션에없는 모든 명령문은 새로운 트랜잭션을 시작합니다. 내가 의도 한 바를 두 번 수행 한 경우에만 커밋합니다.


0

프로덕션 데이터베이스가 구성된 유일한 Windows 사용자 인 별도의 Windows 사용자를 사용해보십시오 . 이 사용자의 전체 색상 테마를 빨간색으로 설정하십시오. 빠른 사용자 전환으로 아무 문제가 없습니다.

개발 컴퓨터에있는 계정에서 프로덕션 자격 증명을 사용 하지 마십시오 . 짧은 전화 또는 동료 질문으로 새로운 테스트 실행을 위해 모든 것을 행복하게 삭제하고 있습니다 ...

다른 옵션 (같은 아이디어)은 다른 테마를 가진 원격 데스크톱 또는 virtul 시스템을 사용하는 것입니다.


0

F5를 눌렀을 때 쿼리 창에서 모든 것을 실행하지 못하게하는 또 다른 간단한 방법은 모든 내용을 / * 및 * /로 둘러 싸서 전체를 주석으로 만드는 것입니다.

주석으로 묶여 있어도 원하는 방식으로 강조 표시하고 일반적인 방법으로 F5를 눌러 원하는 명령문을 계속 실행할 수 있습니다.

참고 :이 방법을 선택하면 구문 강조 또는 자동 완성의 이점을 누릴 수 없지만 그 기능을 많이 사용하지 않으면 손상을 100 % 불가능하게하기 위해 희생 할 가치가 있습니다. 실수로 F5가있는 데이터베이스

편집 : 쿼리 창 내에서 / * * /를 사용할 수 없습니다. 그렇지 않으면 후속 코드의 주석 처리가 취소됩니다. 대신-표기법을 사용해야합니다.


-1

원래 질문에 대한 swasheck의 의견과 일치하여 실행은 어떻습니까?

@@ 서버 이름 + '\'+ @@ 서비스 이름을 선택하십시오.

... DML을 실행하기 전에 또는 상태 표시 줄을보고 연결되어있는 인스턴스를 확인하거나 트랜잭션에서 모든 DML을 실행하여 실수를 한 경우 롤백 할 수 있습니까? 여기에 많은 훌륭한 제안이 있지만 기본적으로 잠재적으로 파괴적인 DML과 관련하여 특수 효과는 지금까지만 얻을 수 있습니다. 항상 확인하고 다시 확인하고 다시 확인하십시오. 그리고 소량의 데이터를 처리하는 경우 DML 이전에 새 테이블을 선택하고 DML을 실행하고 비교를 수행하여 제대로 작동하는지 확인한 다음 "백업"테이블을 삭제할 수도 있습니다. 더 힘들지 않고 더 똑똑하게 일하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.