การพิจารณาว่าเกิดการเปลี่ยนแปลงสกีมาอย่างไร


21

สิ่งเลวร้ายเกิดขึ้นเมื่อวานนี้

มุมมองที่สร้างขึ้นเมื่อไม่นานมานี้มีการแก้ไขโดยคนที่ทำลายรายงานในที่สุด น่าเสียดาย. บางคน (รู้ทั้งรู้หรือไม่รู้) ทำการปรับเปลี่ยนนี้ในฐานข้อมูล PRODUCTION

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

หากคำถามของฉันไม่ชัดเจนโปรดแสดงความคิดเห็น

คำตอบ:


36

สิ่งนี้จะได้รับการบันทึกไว้ในการติดตามเริ่มต้นดังนั้นตราบใดที่มีการเปิดใช้งานและไม่ได้ย้อนกลับไปในขณะเดียวกันควรปรากฏในรายงาน "ประวัติการเปลี่ยนแปลง Schema"

หากต้องการเข้าถึงสิ่งนี้ใน Management Studio ให้คลิกขวาที่ฐานข้อมูลจากเมนูบริบท Reports -> Standard Reports -> Schema Changes History

เพื่อดึงข้อมูลเดียวกันผ่าน TSQL คุณสามารถใช้

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )

ขอบคุณมาร์ตินฉันดำเนินการค้นหาโดยแทนที่ 'FOO' ด้วยมุมมองของฉัน แต่นั่นไม่ได้ส่งคืนอะไรเลย ความคิดใด ๆ ที่เกิดขึ้น? ฉันดำเนินการไม่ได้อยู่บนเซิร์ฟเวอร์แม้ว่า
xorpower

1
@ Xorpower - ฉันแก้ไขมันเพื่อจัดการกับObject:Createdเหตุการณ์เช่นกันในกรณีที่มุมมองถูกทิ้งและสร้างขึ้นแทนที่จะเปลี่ยนแปลง ไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยไม่ทำงานบนเซิร์ฟเวอร์? คุณต้องเชื่อมต่อกับอินสแตนซ์ที่ถูกต้องแน่นอน แต่ไม่สำคัญว่าการเชื่อมต่อนั้นมาจากที่ใดตราบใดที่คุณมีสิทธิ์ใช้งาน
Martin Smith

ขอบคุณมาร์ติน แต่ผลลัพธ์ยังคงเหมือนเดิม
xorpower


3
@ Xorpower - ดูเหมือนว่าการติดตามได้คลี่คลายไปแล้วและคุณได้สูญเสียรายละเอียดใด ๆ ที่เก่ากว่าประมาณ 11 ชั่วโมง การติดตามเริ่มต้นจะเก็บ 5 ไฟล์เท่านั้นจากนั้นลบไฟล์ที่เก่ากว่า คุณอาจต้องการตรวจสอบระบบไฟล์บนเซิร์ฟเวอร์เพื่อตรวจสอบกรณีนี้อย่างแน่นอน คุณสามารถหาพา ธ โฟลเดอร์ได้จากSELECT path FROM sys.traces where is_default=1
Martin Smith

19

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

วิธีหนึ่งคือไปโดยการทำธุรกรรมเริ่มดำเนินการ:

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

ถ้าALTER VIEWออกมาในการทำธุรกรรมแบบสแตนด์อโลน (ie. ไม่ล้อมรอบด้วยBEGIN TRANSACTION/ COMMIT) CreatProc transactionจากนั้นก็จะเริ่มต้นการทำธุรกรรมที่มีชื่อว่า ค้นหาและ[Transaction SID]เป็น SID สำหรับเข้าสู่ระบบที่คุณต้องการ

ความเป็นไปได้อีกอย่างหนึ่งคือการค้นหาธุรกรรมที่ได้รับ SCH_M ในมุมมองที่คุณต้องการ:

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

โปรดทราบว่าหากมุมมองถูกเปลี่ยนโดย DROP ตามด้วย CREATE รหัสวัตถุอาจมีการเปลี่ยนแปลง แต่อย่างน้อยคุณจะได้รับธุรกรรมที่สร้าง CREATE ล่าสุด (รหัสวัตถุปัจจุบันของมุมมองใน db ที่กู้คืน) ด้วย id การทำธุรกรรมคุณย้อนกลับไปและดึงข้อมูลธุรกรรมเริ่มต้น:

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

[ธุรกรรม SID] นั้นเป็นอีกครั้งที่คนของคุณ ใช้SUSER_SNAMEเพื่อเรียกชื่อล็อกอินจาก login SID หาก SID เป็น 0x01 หมายถึงการเข้าสู่ระบบsaซึ่งหมายถึงบุคคลใด ๆ ที่รู้saรหัสผ่านสามารถทำได้


2
เคล็ดลับดีในการอ่านไฟล์บันทึก สิ่งนี้มีประโยชน์หากมีคนปิดการใช้งานร่องรอยเริ่มต้น
StanleyJohns

เกิดอะไรขึ้นถ้าธุรกรรม SID เป็นโมฆะ?
evictednoise

@evictednoise โปรดโพสต์บันทึกที่เกี่ยวข้อง (ในคำถามแยกต่างหาก) อาจเป็นได้มากกว่าหนึ่งเหตุผลและบันทึกการบันทึกจะช่วยระบุสาเหตุที่แท้จริง
Remus Rusanu

6

ไม่เว้นแต่ว่าคุณบันทึกผ่านทางทริกเกอร์ DDL หรือเช่นนั้น

คุณต้องการดูว่าใครเป็นสิทธิ์ในการเปลี่ยนแปลงในฐานข้อมูลนั้นหรือการเป็นสมาชิกของบทบาท sysadmin / db_owner / ddl_admin นี่จะเป็นการดีกว่าเพราะเป็นการทบทวนทั่วไปมากกว่าการล่าแม่มด อาจมีคนอื่น ๆ ที่มีสิทธิในการทำการเปลี่ยนแปลงที่ไม่ได้รับการอนุมัติและไม่ได้รับอนุญาตเช่นกัน


0

หากคุณยังไม่ได้ดำเนินการคุณอาจต้องการตรวจสอบรายงานประวัติการเปลี่ยนแปลง Schema ที่มีอยู่ใน SQL Server Management Studio ดูเหมือนว่า SQL Server จะบันทึกการเปลี่ยนแปลงตามค่าเริ่มต้น (การติดตามเริ่มต้น ) และคุณควรจะสามารถดูข้อมูลผ่านรายงานนี้ได้ สิ่งที่โชคร้ายเพียงอย่างเดียวคือไฟล์ติดตามเหล่านี้จะถูกลบ / ม้วนโดยอัตโนมัติเมื่อเวลาผ่านไปดังนั้นข้อมูลอาจหายไปแล้ว โชคดี!


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