it-swarm.asia

تحديد كيف حدث تغيير المخطط؟

حدث شيء سيئ أمس.

تم تعديل العرض الذي تم إنشاؤه قبل فترة ما من قبل شخص خرق التقارير في النهاية. للأسف. قام شخص (عن علم أو بدون علم) بإجراء هذا التعديل في قاعدة بيانات الإنتاج.

سؤالي: هل هناك طريقة (سكريبت/برنامج/مجانية وما إلى ذلك) يمكننا من خلالها معرفة من (اسم المستخدم) قام بهذا التعديل ، حتى أتمكن من إلغاء الوصول إلى قاعدة بيانات الإنتاج لهذا المستخدم.

إذا كان سؤالي غير واضح ، يرجى التعليق.

21
xorpower

يتم تسجيل هذا في التتبع الافتراضي لذلك ، طالما أنه ممكَّن ولم يتم ترحيله في هذه الأثناء ، يجب أن يظهر في تقرير "سجل تغييرات المخطط".

للوصول إلى هذا في 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*/ )
36
Martin Smith

أشار مارتن بالفعل إلى أفضل طريق ، وهو تتبع المراجعة الإدارية الذي عادة ما يكون قيد التشغيل (ما لم يتم تعطيله بشكل صريح). إذا لا يمكنك العثور على المعلومات في تتبع المشرف (تم تعطيله أو تم إعادة تدويره) يمكنك يمكنك استرجاع المعلومات من النسخ الاحتياطية للسجل. نظرًا لأن قاعدة بيانات الإنتاج ، أفترض أن لديك دورة نسخ احتياطي منتظمة ، مع نسخ احتياطي دوري كامل ونسخ احتياطية للسجل. ستحتاج إلى استعادة قاعدة البيانات ، على خادم منفصل ، إلى وقت وقوع الحادث تقريبًا بحيث يكون DDL في السجل المستعاد الحالي. ثم هي مسألة بسيطة لاستخدام fn_dblog() وفحص السجل.

إحدى الطرق هي أن تبدأ العمليات من خلال المعاملات:

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

إذا تم إصدار ALTER VIEW في معاملة قائمة بذاتها (أي غير محاطة بـ BEGIN TRANSACTION/COMMIT) ، فستبدأ معاملة باسم CreatProc transaction. ابحث عنه ، و [Transaction 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 (معرف الكائن الحالي للعرض في قاعدة البيانات المستعادة). باستخدام معرف المعاملة ، يمكنك الرجوع واسترداد معلومات بدء المعاملة:

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

[الصفقة SID] هو ، مرة أخرى ، الرجل. استخدم SUSER_SNAME لاسترداد اسم تسجيل الدخول من SID الخاص بتسجيل الدخول. إذا كان SID هو 0x01 ، فهذا يعني أن تسجيل الدخول كان sa ، مما يعني أن أي شخص يعرف كلمة المرور sa يمكنه فعل ذلك.

19
Remus Rusanu

لا ، ما لم تقم بتسجيله عبر مشغل DDL أو ما شابه

تريد إلقاء نظرة على حقوق ALTER في قاعدة البيانات هذه ، أو العضوية في دور مسؤول النظام/db_owner/ddl_admin. سيكون هذا أفضل كمراجعة عامة بدلاً من مطاردة الساحرات. ربما يكون هناك أشخاص آخرون لديهم حقوق لإجراء تغييرات غير مصرح بها وغير مصرح بها أيضًا

6
gbn

إذا لم تكن قد قمت بذلك بالفعل ، فقد ترغب في التحقق من تقرير محفوظات تغييرات المخطط متوفر في SQL Server Management Studio. يبدو أن SQL Server يسجل التغييرات بشكل افتراضي ( التتبع الافتراضي ) ويجب أن تكون قادرًا على عرض هذه البيانات عبر هذا التقرير. الشيء المؤسف الوحيد هو أن يتم حذف/تمرير ملفات التتبع هذه تلقائيًا مع مرور الوقت ، لذلك قد تكون البيانات قد اختفت بالفعل. حظا طيبا وفقك الله!

0
Mark Madej