Làm thế nào tôi có thể giảm thiểu rủi ro vô tình sửa đổi cơ sở dữ liệu sai?


12

Tôi vừa học được một cách khó khăn là việc ngắt kết nối với máy chủ trong Object Explorer không ngăn bạn sau đó thực hiện các cửa sổ truy vấn đã mở trên máy chủ đó.

Tình huống của tôi là như thế này: Tôi có một phiên bản SSMS mà tôi sử dụng để kết nối với máy chủ dev / staging và với máy chủ sản xuất của chúng tôi. Tôi đã phải xóa một loạt dữ liệu trên dev vì vậy tôi nghĩ rằng tôi nên đóng kết nối của mình với sản xuất, nhưng tôi không chú ý đến cửa sổ truy vấn tôi đang sử dụng. (May mắn thay, chúng tôi đã có một bản sao lưu chỉ vài giờ tuổi.)

Tôi không phải là người đầu tiên phá hủy dữ liệu sản xuất và tôi sẽ không phải là người cuối cùng tôi chắc chắn. Vì vậy, tôi đang tìm kiếm danh sách kiểm tra, thực tiễn tốt nhất, v.v ... giúp bạn giảm thiểu rủi ro khi thực hiện các truy vấn trên cơ sở dữ liệu sai. Bạn đã có điều này xảy ra với bạn trước đây chưa, và bạn đã điều chỉnh quy trình làm việc của mình như thế nào để cố gắng tránh điều này?


4
chú ý đến những gì bạn đang làm.
swasheck

Công cụ SQL của tôi (không phải SSMS) cho phép tôi bật "chế độ chỉ đọc", đơn giản là từ chối mọi tuyên bố có khả năng thay đổi cơ sở dữ liệu.
a_horse_with_no_name

Ngủ đủ giấc và tập thể dục, chú ý nhiều hơn.

Câu trả lời:


11

Một điều tôi muốn làm trong SSMS là sử dụng Màu tùy chỉnh khi kết nối với cơ sở dữ liệu. Vì vậy, bạn chọn một cơ sở dữ liệu Red for Live tươi sáng và màu xanh lam hoặc xanh lục nhẹ nhàng cho các hệ thống dev hoặc thử nghiệm. Tôi đã từng sử dụng SSMS sẵn có, nhưng ngày nay tôi thích mã hóa Addon Color của SSMS Tools.

Như thế này

Hoặc như thế này cho Công cụ SSMS (Một addon thực sự đẹp và tôi thấy màu sắc tốt hơn khi ở trên đầu, thay vì ở dưới cùng như tích hợp trên) Hoặc cái này


2
+1 Đây là những gì tôi làm. Sử dụng màu đỏ cho sản xuất, màu vàng cho môi trường thử nghiệm và màu xanh lá cây cho cơ sở dữ liệu phát triển địa phương của tôi. Ẩn dụ đèn giao thông cũ hoạt động tốt ở đây.
LeopardSkinPillBoxHat

6

Tùy thuộc vào người bạn hỏi, nó sẽ đòi hỏi nhiều công việc hơn một chút, nhưng tôi có thói quen luôn sử dụng câu lệnh dưới đây cho tất cả các cửa sổ truy vấn sản xuất hoặc tiền sản xuất, và cho tất cả UPDATE, DELETEvà các INSERTcâu lệnh trong tất cả các môi trường.

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

Nếu tôi thấy điều này, tôi sẽ biết ngay, "Rất tiếc, cửa sổ truy vấn đó vẫn được kết nối" hoặc "Ôi trời, tôi tự động làm điều gì đó tôi không nên có" - và vâng, bạn có thể đóng cơ sở dữ liệu trong trình thám hiểm đối tượng, nhưng cửa sổ truy vấn vẫn có thể được kết nối. Trong tâm trí của tôi, tất cả các truy vấn sản xuất nên được làm nổi bật và chạy với BEGIN TRAN; một F5 tình cờ trên tất cả mọi thứ, nên cuộn mọi thứ lại, không COMMIT. Điều này làm là buộc người dùng phải ý thức về hành động của mình; tương tự như chụp ảnh mỗi bữa ăn bạn sẽ giúp bạn giảm cân vì bạn phải dừng lại và suy nghĩ về những gì bạn đang làm.

Có mất nhiều thời gian để làm? Đúng. Liệu nó có dừng 100% lỗi không. Vâng, bởi vì không có gì cam kết, trừ khi tôi tự ép buộc COMMIT, đăng bài, điều mà bản chất của nó sẽ buộc tôi phải xem xét COMMIT.


4
Tôi cũng giảng về cách thực hành này (và đó là một tính năng khác của Gói công cụ SSMS - cho phép bạn tùy chỉnh mẫu Truy vấn mới), nhưng bạn phải cẩn thận về kịch bản ngược lại - bạn làm nổi bật BEGIN TRAN và truy vấn, nhưng quên chạy CAM KẾT hoặc ROLLBACK, sau đó huýt sáo khi bạn rời khỏi tòa nhà để ăn trưa, cuối tuần hoặc nghỉ phép 6 tháng.
Aaron Bertrand

6

Tạo tài khoản người dùng thứ hai để thay đổi sản xuất và thu hồi quyền truy cập mà tài khoản của bạn hiện có. Khi bạn muốn làm công cụ trong sản xuất, bạn có thể chạy ssms với tư cách là người dùng thứ hai.

EDIT: Điều này sẽ chỉ có lợi trong trường hợp đăng nhập tên miền. Nếu bạn có hai tài khoản miền riêng biệt, bạn sẽ buộc phải có các phiên bản SSMS riêng cho DEV và PROD. Nếu bạn không sử dụng tài khoản miền, đề xuất này sẽ không thực sự giúp bạn nhiều.

Ngoài ra, nếu bạn đang sử dụng các tài khoản miền riêng biệt, bạn có thể điều chỉnh cài đặt màu SSMS cho mỗi người dùng, có thể có nền màu đỏ sáng cho tài khoản kết nối với SẢN PHẨM.

Dưới đây là một tờ giấy trắng tốt mà đến tâm cũng như: http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

Nó thảo luận về những điều như không cho phép tài khoản đăng nhập SA hàng ngày của bạn truy cập đầy đủ.


Bạn có nghĩa là bằng cách nào đó sẽ vô hiệu hóa quyền truy cập vào nhiều máy chủ từ một cá thể SSMS? Hay những gì tôi đã bỏ lỡ?
Andriy M

Chúng tôi đã sử dụng các tài khoản người dùng khác nhau, tôi thực sự không thấy điều đó hữu ích như thế nào.
Stijn

1
Tôi đoán điều này sẽ chỉ thực sự áp dụng nếu bạn đang sử dụng tài khoản miền. Nếu đó là trường hợp hoặc sẽ buộc bạn sử dụng một trường hợp riêng nếu SSMS cho các kết nối DEV và PROD của bạn. Có lẽ tôi sẽ viết một bổ trợ SSMS giúp cho kịch bản này, có thể bật lên một cảnh báo bất cứ khi nào bạn cố chạy mã trên kết nối sản xuất của mình ...
Mark Wilkinson

Oof, xin lỗi cho tất cả các lỗi chính tả trong bình luận. Phản ứng sáng sớm qua điện thoại di động ... nhưng bạn có ý tưởng. :)
Mark Wilkinson

Vâng tôi đã nhận được ý chính của câu trả lời của bạn :) Có lẽ bạn có thể đưa ra nhận xét của mình vào câu trả lời của bạn?
Stijn

4

Hãy xem bổ trợ của tôi: SSMSBoost. Nó có chính xác những gì bạn cần. Tôi đã cải thiện tính năng tô màu Thanh trạng thái SSMS để nó theo dõi cơ sở dữ liệu hiện tại của bạn và thay đổi màu sắc. Ngoài ra, bạn có thể thêm chú giải công cụ nổi "cảnh báo DB quan trọng":

nhập mô tả hình ảnh ở đây

Đọc thêm về tính năng này tại đây: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections


2

Trong một trong những công việc của tôi, chúng tôi đã phát triển một công cụ cho mục đích này.

Nếu bạn muốn chạy một tuyên bố về SẢN XUẤT, nó buộc bạn phải viết:

run_sql servername PROD <file_with_sqlstatements>.sql

Nó sẽ ghi kết quả vào logfile và nối thêm phần thực thi vào nhật ký trong cơ sở dữ liệu quản lý của chúng tôi. Chẳng hạn, nó rất tiện lợi khi chúng tôi muốn tìm ra ai là người cuối cùng thay đổi một bảng nhất định.

Trong SSMS, khi bạn đã đăng ký máy chủ, bạn có thể áp dụng một màu nhất định cho kết nối, ví dụ như tất cả các kết nối SẢN PHẨM có màu đỏ ở phía dưới. Nhưng tốt nhất là tránh sử dụng các công cụ GUI trên máy chủ sản xuất nếu có thể.


Tôi chỉ chạy SSMS trên máy của mình, mẹo hay về màu sắc cho chuỗi kết nối.
Stijn

3
@Stijn lưu ý rằng tính năng màu tích hợp không hoạt động trong tất cả các tình huống - phụ thuộc vào cách bạn mở cửa sổ truy vấn. Một thứ đáng tin cậy hơn nhiều (nhưng không miễn phí trên SSMS 2012+) là SSMS Tools Pack . Mladen vừa phát hành phiên bản tương thích 2014.
Aaron Bertrand

@Aaron công cụ này trông rất thú vị, tôi sẽ xem phiên bản dùng thử, cảm ơn!
Stijn

4
Một giải pháp tô màu thay thế khác là trong SQL Prompt , mặc dù không miễn phí, là một bộ công cụ khá tiện lợi. Điều này tô màu các tab ở trên cùng, thay vì chỉ ở phía dưới mà SSMS thực hiện.
Mark Sinkinson

1

Chỉ còn hai mẹo nữa, vì tôi chưa thấy gì tương tự ở đây:

  1. Trong quy trình làm việc của tôi, tôi thường làm việc với nhiều câu lệnh trong một cửa sổ và tôi khá quen với luồng chọn văn bản-sau đó chạy. Nhưng tôi luôn sợ khi vô tình nhấn F5 khi không có văn bản nào được chọn và thực hiện tất cả các câu lệnh trong một cửa sổ. Vì vậy, mỗi khi tôi mở một cửa sổ mới, tôi bắt đầu bằng cách gõ bất cứ thứ rác nào SQL sẽ từ chối biên dịch. Điều này có hiệu quả làm cho toàn bộ lô không thực thi. (Cảnh báo! Nếu bạn sử dụng nhiều lô được phân tách bằng GOthì rác được yêu cầu cho mỗi lô.)

  2. Khi thực hiện thay đổi dữ liệu trên máy chủ sản xuất (hoặc bất cứ khi nào tôi cần hết sức cẩn thận) - các giao dịch ngầm rất hữu ích (bạn SET IMPLICIT_TRANSACTIONS ONhoặc thay đổi tùy chọn trong SSMS để tùy chọn này có hiệu lực cho mọi cửa sổ mới). Bằng cách này, mọi tuyên bố không có trong giao dịch - bắt đầu một giao dịch mới. Tôi chỉ cam kết nếu tôi đảm bảo hai lần rằng tôi đã làm những gì tôi dự định.


0

Hãy thử sử dụng một người dùng windows riêng biệt, người duy nhất có cơ sở dữ liệu sản xuất được cấu hình. Đặt toàn bộ chủ đề màu của người dùng này thành màu đỏ. Với việc chuyển đổi người dùng nhanh, điều này sẽ không có vấn đề gì.

Không bao giờ sử dụng thông tin đăng nhập sản xuất trong tài khoản trên máy phát triển. Một câu hỏi ngắn về điện thoại hoặc đồng nghiệp và sau đó bạn vui vẻ xóa mọi thứ cho bản thử nghiệm mới của mình ...

Một tùy chọn khác (cùng ý tưởng) là sử dụng máy tính để bàn từ xa hoặc máy tính có chủ đề khác.


0

Một cách khác khá đơn giản để ngăn chặn việc thực thi mọi thứ trong cửa sổ truy vấn khi nhấn F5 sẽ là bao quanh tất cả nội dung với / * và * / do đó làm cho toàn bộ nhận xét.

Bạn vẫn có thể thực hiện các câu lệnh bạn muốn bằng cách tô sáng chúng và nhấn F5 theo cách thông thường, mặc dù chúng được đính kèm trong một bình luận.

Lưu ý: nếu bạn chọn phương pháp này, bạn sẽ không thể hưởng lợi từ việc tô sáng cú pháp hoặc tự động hoàn thành, nhưng nếu bạn không sử dụng các tính năng đó nhiều thì có thể hy sinh chúng để đảm bảo rằng nó không thể bị hư hại 100% cơ sở dữ liệu với F5 tình cờ.

Chỉnh sửa: bạn cũng sẽ không thể sử dụng / * * / bất cứ nơi nào trong cửa sổ truy vấn, nếu không bạn sẽ vô tình bỏ sót mã tiếp theo. Cần phải gắn bó với - ký hiệu thay thế.


-1

Đồng ý với nhận xét của swasheck về câu hỏi ban đầu, cách thực hiện ...

chọn @@ servername + '\' + @@ tên dịch vụ

... trước khi chạy bất kỳ DML nào, hoặc thậm chí nhìn vào thanh trạng thái để xem trường hợp nào bạn đã kết nối hoặc thậm chí chạy tất cả DML trong giao dịch để bạn có thể quay lại nếu bạn nhận ra mình đã nhầm lẫn? Rất nhiều gợi ý tuyệt vời ở đây, nhưng về cơ bản, khi nói đến DML có khả năng phá hủy, mánh lới quảng cáo sẽ chỉ đưa bạn đến nay. Tôi luôn kiểm tra, kiểm tra lại và kiểm tra lại. Và nếu tôi đang xử lý một lượng nhỏ dữ liệu, tôi thậm chí có thể CHỌN VÀO một bảng mới trước DML, chạy DML của tôi, thực hiện một số so sánh để đảm bảo mọi thứ hoạt động chính xác, sau đó bỏ bảng "sao lưu". Làm việc thông minh hơn chứ không chăm chỉ hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.