ฉันจะลดความเสี่ยงในการแก้ไขฐานข้อมูลผิดโดยไม่ตั้งใจได้อย่างไร


12

ฉันเพิ่งเรียนรู้วิธีที่ยากที่จะตัดการเชื่อมต่อจากเซิร์ฟเวอร์ใน Object Explorer ไม่ได้หยุดคุณหลังจากนั้นในการดำเนินการหน้าต่างแบบสอบถามที่เปิดอยู่แล้วบนเซิร์ฟเวอร์นั้น

สถานการณ์ของฉันเป็นเช่นนี้: ฉันมี SSMS หนึ่งอินสแตนซ์ที่ฉันใช้เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ dev / staging และเซิร์ฟเวอร์ที่ใช้งานจริงของเรา ฉันต้องลบข้อมูลจำนวนมากบน dev ดังนั้นฉันจึงคิดว่าฉันควรปิดการเชื่อมต่อกับการผลิต แต่ฉันไม่ได้สนใจหน้าต่างแบบสอบถามที่ฉันใช้ (โชคดีที่เรามีการสำรองข้อมูลไว้เพียงไม่กี่ชั่วโมง)

ฉันไม่ใช่คนแรกที่ทำลายข้อมูลการผลิตและฉันจะไม่ใช่คนสุดท้ายที่ฉันแน่ใจ ดังนั้นฉันกำลังมองหารายการตรวจสอบแนวทางปฏิบัติที่ดีที่สุด ฯลฯ ที่ช่วยให้คุณลดความเสี่ยงในการดำเนินการค้นหาในฐานข้อมูลผิด คุณเคยเกิดเหตุการณ์เช่นนี้กับคุณมาก่อนและคุณได้ปรับเวิร์กโฟลว์ของคุณเพื่อพยายามหลีกเลี่ยงปัญหานี้ได้อย่างไร


4
ใส่ใจกับสิ่งที่คุณทำ
swasheck

เครื่องมือ SQL ของฉัน (ไม่ใช่ SSMS) ช่วยให้ฉันเปิด "โหมดอ่านอย่างเดียว" ซึ่งจะปฏิเสธคำสั่งใด ๆ ที่อาจเปลี่ยนฐานข้อมูลได้
a_horse_with_no_name

นอนหลับให้เพียงพอและออกกำลังกายให้ความสนใจมากขึ้น

คำตอบ:


11

สิ่งหนึ่งที่ฉันชอบทำใน SSMS คือการใช้ Custom Colors เมื่อเชื่อมต่อกับฐานข้อมูล ดังนั้นคุณจึงเลือกสีแดงที่สดใสสำหรับฐานข้อมูล Live และเลือกสีน้ำเงินหรือสีเขียวสำหรับระบบ dev หรือทดสอบ ฉันเคยใช้ SSMS แบบ inbuilt แต่วันนี้ฉันชอบการเพิ่มสี SSMS เครื่องมือ Addon Color

แบบนี้

หรืออย่างนี้สำหรับเครื่องมือ SSMS (เป็น addon ที่ดีจริงๆและฉันพบสีที่ดีกว่าเมื่อมันอยู่ด้านบนแทนที่จะอยู่ด้านล่างเหมือนในตัว) หรือสิ่งนี้


2
+1 นี่คือสิ่งที่ฉันทำ ใช้สีแดงสำหรับการผลิตสีเหลืองสำหรับสภาพแวดล้อมการทดสอบและสีเขียวสำหรับฐานข้อมูลการพัฒนาท้องถิ่นของฉัน อุปมาสัญญาณไฟจราจรแบบเก่าทำงานได้ดีที่นี่
LeopardSkinPillBoxHat

6

ทั้งนี้ขึ้นอยู่กับคนที่คุณถามก็จะต้องมีการทำงานน้อยมาก แต่ผมได้รับในนิสัยของเสมอโดยใช้คำสั่งดังต่อไปนี้สำหรับทุกผลิตหรือก่อนการผลิตหน้าต่างแบบสอบถามและสำหรับทั้งหมดUPDATE, DELETEและINSERTงบในทุกสภาพแวดล้อม

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

ถ้าฉันเห็นสิ่งนี้ฉันจะรู้ทันทีว่า "โอ๊ะโอหน้าต่างแบบสอบถามนั้นยังคงเชื่อมต่ออยู่" หรือ "อึฉันทำสิ่งที่ฉันไม่ควรมี" - และใช่คุณสามารถปิดฐานข้อมูลใน Object explorer ได้ หน้าต่างแบบสอบถามยังคงสามารถเชื่อมต่อได้ ในใจของฉันทุกข้อสงสัยการผลิตควรจะเน้นและทำงานกับBEGIN TRAN; F5 COMMITอุบัติเหตุในทุกสิ่งที่ควรม้วนทุกอย่างกลับไม่ได้ สิ่งนี้จะบังคับให้ผู้ใช้ตระหนักถึงการกระทำของเขาหรือเธอ; เช่นเดียวกับการถ่ายรูปทุกมื้อที่คุณกินจะช่วยให้คุณลดน้ำหนักได้เพราะคุณต้องหยุดและคิดเกี่ยวกับสิ่งที่คุณทำ

ใช้เวลานานกว่าจะทำอย่างไร ใช่. มันหยุดข้อผิดพลาด 100% หรือไม่ ใช่เพราะไม่มีอะไรที่เคยกระทำเว้นแต่ฉันเองบังคับให้พิมพ์โพสต์มันซึ่งธรรมชาติมากจะได้บังคับให้ฉันที่จะต้องพิจารณาCOMMITCOMMIT


4
ฉันเทศนาเกี่ยวกับการฝึกนี้ด้วย (และเป็นอีกคุณสมบัติหนึ่งของ SSMS Tools Pack - อนุญาตให้คุณปรับแต่งเทมเพลต Query ใหม่) แต่คุณต้องระวังเกี่ยวกับสถานการณ์ตรงกันข้าม - คุณเน้น BEGIN TRAN และแบบสอบถาม แต่ลืมเรียกใช้ COMMIT หรือ ROLLBACK จากนั้นเป่านกหวีดเมื่อคุณออกจากอาคารเพื่อทานอาหารกลางวันวันหยุดสุดสัปดาห์หรือวันละ 6 เดือน
Aaron Bertrand

6

สร้างบัญชีผู้ใช้ที่สองสำหรับการเปลี่ยนแปลงการผลิตและยกเลิกการเข้าถึงบัญชีของคุณในปัจจุบัน เมื่อคุณต้องการทำสิ่งต่าง ๆ ในการผลิตคุณสามารถเรียกใช้ ssms เป็นผู้ใช้ที่สอง

แก้ไข: นี่จะเป็นประโยชน์ในกรณีของการเข้าสู่ระบบโดเมนเท่านั้น หากคุณมีบัญชีโดเมนสองบัญชีแยกกันคุณจะถูกบังคับให้มีอินสแตนซ์แยกต่างหากของ SSMS สำหรับ DEV และ PROD หากคุณไม่ได้ใช้บัญชีโดเมนคำแนะนำนี้จะไม่ช่วยคุณมากนัก

นอกจากนี้หากคุณใช้บัญชีโดเมนแยกต่างหากคุณสามารถปรับการตั้งค่าสี 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
ฉันเดาว่านี่จะมีผลบังคับใช้จริงๆถ้าคุณใช้บัญชีโดเมน หากเป็นเช่นนั้นหรือบังคับให้คุณใช้อินสแตนซ์แยกต่างหากหาก SSMS สำหรับการเชื่อมต่อ DEV และ PROD ของคุณ บางทีผมอาจจะเขียน SSMS add-in ที่ช่วยให้กับสถานการณ์นี้อาจจะโผล่ขึ้นมาเตือนเมื่อใดก็ตามที่คุณพยายามที่จะเรียกใช้รหัสในการเชื่อมต่อการผลิตของคุณ ...
มาร์ควิลกินสัน

ขออภัยด้วยสำหรับการพิมพ์ผิดทั้งหมดในความคิดเห็น การตอบสนองตอนเช้าผ่านโทรศัพท์มือถือ ... แต่คุณเข้าใจแล้ว :)
Mark Wilkinson

ใช่ฉันได้รับส่วนสำคัญของคำตอบของคุณ :) บางทีคุณสามารถแสดงความคิดเห็นในคำตอบของคุณ?
Stijn

4

ดูที่ Add-in ของฉัน: SSMSBoost มันมีสิ่งที่คุณต้องการ ฉันได้ปรับปรุงคุณสมบัติการระบายสีแถบสถานะ SSMS เพื่อให้สามารถติดตามฐานข้อมูลปัจจุบันของคุณและเปลี่ยนสีได้ นอกจากนี้คุณสามารถเพิ่มคำแนะนำเครื่องมือลอยตัว

ป้อนคำอธิบายรูปภาพที่นี่

อ่านเพิ่มเติมเกี่ยวกับคุณสมบัตินี้ได้ที่: http://www.ssmsboost.com/Features/ssms-add-in-preferred-connections


2

หนึ่งในงานของฉันเราพัฒนาเครื่องมือสำหรับจุดประสงค์นี้

หากคุณต้องการเรียกใช้คำสั่งบน PROD มันบังคับให้คุณเขียน:

run_sql servername PROD <file_with_sqlstatements>.sql

มันจะเขียนผลลัพธ์ไปที่ logfile และผนวกการดำเนินการลงในบันทึกในฐานข้อมูลการจัดการของเรา มันมีประโยชน์มากเช่นเมื่อเราต้องการรู้ว่าใครเป็นคนสุดท้ายที่จะเปลี่ยนตารางบางอย่าง

ใน SSMS เมื่อคุณมีเซิร์ฟเวอร์ที่ลงทะเบียนคุณสามารถใช้สีบางอย่างกับการเชื่อมต่อเพื่อให้ตัวอย่างเช่นการเชื่อมต่อ PROD ทั้งหมดมีสีแดงที่ด้านล่าง แต่วิธีที่ดีที่สุดคือหลีกเลี่ยงการใช้เครื่องมือ GUI บนเซิร์ฟเวอร์ที่ใช้งานจริงถ้าเป็นไปได้


ฉันใช้ SSMS บนเครื่องของฉันเท่านั้นเคล็ดลับที่ดีเกี่ยวกับสีของสตริงการเชื่อมต่อ
Stijn

3
@Stijn โปรดทราบว่าคุณลักษณะสีในตัวไม่สามารถใช้งานได้ในทุกสถานการณ์ - ขึ้นอยู่กับวิธีที่คุณเปิดหน้าต่างคิวรี หนึ่งที่เป็นจำนวนมากที่มีความน่าเชื่อถือมากขึ้น ( แต่ไม่ฟรีใน SSMS 2012+) เป็นเครื่องมือ SSMS แพ็ค Mladen เพิ่งเปิดตัวเวอร์ชั่นที่รองรับ 2014
Aaron Bertrand

@ Aaron เครื่องมือดูน่าสนใจมากฉันจะดูรุ่นทดลองขอบคุณ!
Stijn

4
อีกวิธีการแก้ปัญหาสีอื่นอยู่ในSQL Promptซึ่งแม้ว่าจะไม่ฟรีเป็นชุดที่ดี ซึ่งจะทำให้แท็บต่างๆเป็นสีที่ด้านบนแทนที่จะเป็นที่ด้านล่างซึ่ง SSMS ทำ
Mark Sinkinson

1

อีกสองเคล็ดลับเนื่องจากฉันไม่เห็นอะไรที่คล้ายกันที่นี่:

  1. ในเวิร์กโฟลว์ของฉันฉันมักจะทำงานกับหลายงบในหน้าต่างเดียวและฉันค่อนข้างคุ้นเคยกับโฟลว์ข้อความที่เลือกแล้วเรียกใช้ แต่ฉันกลัวเสมอที่จะกด F5 โดยไม่ตั้งใจเมื่อไม่มีข้อความถูกเลือกและดำเนินการคำสั่งทั้งหมดในหน้าต่างเป็นผลลัพธ์ ดังนั้นทุกครั้งที่ฉันเปิดหน้าต่างใหม่ฉันจะเริ่มต้นด้วยการพิมพ์ SQL ขยะใด ๆ ที่จะปฏิเสธที่จะรวบรวม สิ่งนี้ทำให้ชุดทั้งหมดไม่สามารถปฏิบัติการได้ (คำเตือน! ถ้าคุณใช้แบทช์หลายชุดคั่นด้วยGOแล้วจำเป็นต้องมีขยะในแต่ละแบทช์)

  2. เมื่อทำการเปลี่ยนแปลงข้อมูลบนเซิร์ฟเวอร์ที่ใช้งานจริง (หรือเมื่อใดก็ตามที่ฉันต้องการความระมัดระวังอย่างยิ่ง) - ธุรกรรมโดยนัยมีประโยชน์มาก (คุณSET IMPLICIT_TRANSACTIONS ONหรือเปลี่ยนตัวเลือกใน SSMS เพื่อให้ตัวเลือกนั้นมีประสิทธิภาพสำหรับทุกหน้าต่างใหม่) วิธีนี้ทุกคำสั่งที่ไม่ได้อยู่ในธุรกรรม - เริ่มทำธุรกรรมใหม่ ฉันจะทำก็ต่อเมื่อฉันแน่ใจว่าสองครั้งว่าฉันทำตามที่ตั้งใจไว้


0

ลองใช้ผู้ใช้ windows ที่แยกต่างหากซึ่งเป็นคนเดียวที่ได้กำหนดค่าฐานข้อมูลการผลิต ตั้งค่าธีมสีทั้งหมดของผู้ใช้รายนี้เป็นสีแดง ด้วยการสลับผู้ใช้อย่างรวดเร็วสิ่งนี้จะไม่มีปัญหา

อย่าใช้ข้อมูลรับรองการผลิตในบัญชีที่อยู่ในเครื่องพัฒนา คำถามสั้น ๆ เกี่ยวกับการโทรหรือเพื่อนร่วมงานและหลังจากนั้นคุณจะลบทุกอย่างอย่างมีความสุขสำหรับ testrun ใหม่ของคุณ ...

ตัวเลือกอื่น (ความคิดเดียวกัน) กำลังใช้เดสก์ท็อประยะไกลหรือเครื่องอัจฉริยะที่มีธีมแตกต่างกัน


0

อีกวิธีที่ค่อนข้างตรงไปตรงมาในการป้องกันการดำเนินการทุกอย่างในหน้าต่างแบบสอบถามเมื่อกด F5 จะเป็นการล้อมรอบเนื้อหาทั้งหมดด้วย / * และ * / จึงทำให้ความคิดเห็นทั้งหมด

คุณยังสามารถเรียกใช้งานข้อความสั่งที่คุณต้องการโดยเน้นข้อความเหล่านั้นแล้วกด F5 ตามปกติแม้ว่าจะอยู่ในความคิดเห็นก็ตาม

หมายเหตุ: หากคุณเลือกวิธีนี้คุณจะไม่สามารถได้รับประโยชน์จากการเน้นไวยากรณ์หรือป้อนอัตโนมัติ แต่ถ้าคุณไม่ได้ใช้คุณสมบัติเหล่านั้นมันก็คุ้มค่าที่จะเสียสละเพื่อให้แน่ใจว่าเป็นไปไม่ได้ที่จะเสียหาย 100% ฐานข้อมูลด้วย F5 โดยไม่ตั้งใจ

แก้ไข: คุณจะไม่สามารถใช้ / * * / ที่ใดก็ได้ภายในหน้าต่างแบบสอบถามมิฉะนั้นคุณจะไม่แสดงข้อคิดเห็นโค้ดที่ตามมาโดยไม่ตั้งใจ จำเป็นต้องใช้สัญลักษณ์ - แทน


-1

ในการเห็นด้วยกับความคิดเห็นของ swasheck ในคำถามเดิมวิธีการเกี่ยวกับการดำเนินการ ...

เลือก @@ ชื่อเซิร์ฟเวอร์ + '\' + @@ servicename

... ก่อนเรียกใช้ DML ใด ๆ หรือแม้แต่ดูที่แถบสถานะเพื่อดูว่าคุณเชื่อมต่อกับอินสแตนซ์ใดหรือดำเนินการ DML ทั้งหมดในธุรกรรมเพื่อให้คุณสามารถย้อนกลับได้หากคุณรู้ว่าคุณทำผิดพลาดหรือไม่ ข้อเสนอแนะที่ดีมากมายที่นี่ แต่โดยทั่วไปเมื่อพูดถึง DML ที่ทำลายล้างแล้วลูกเล่นจะทำให้คุณได้รับจนถึงตอนนี้ ฉันมักจะตรวจสอบตรวจสอบอีกครั้งและตรวจสอบอีกครั้ง และถ้าฉันจัดการกับข้อมูลจำนวนเล็กน้อยฉันอาจเลือกลงในตารางใหม่ก่อน DML เรียกใช้ DML ของฉันทำการเปรียบเทียบบางอย่างเพื่อให้แน่ใจว่าสิ่งต่าง ๆ ทำงานได้อย่างถูกต้องจากนั้นให้วางตาราง "สำรองข้อมูล" ทำงานอย่างชาญฉลาดไม่ยาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.