एक स्कीमा परिवर्तन कैसे हुआ?


21

कल कुछ बुरा हुआ था।

कुछ समय पहले बनाया गया एक दृश्य, किसी व्यक्ति द्वारा संशोधित किया गया था, जिसने अंततः रिपोर्टों को तोड़ दिया। दुर्भाग्य से। किसी ने (जाने-अनजाने) प्रोडक्शन डेटाबेस में इस संशोधन को किया।

मेरा प्रश्न: क्या कोई ऐसा तरीका है (स्क्रिप्ट / सॉफ़्टवेयर / फ़्रीवेयर आदि) जिसके द्वारा हम यह जान सकते हैं कि किसने (उपयोगकर्ता नाम) यह संशोधन किया था, ताकि मैं उस उपयोगकर्ता के लिए उत्पादन डेटाबेस तक पहुँच निरस्त कर सकूँ।

यदि मेरा प्रश्न अस्पष्ट है, तो कृपया टिप्पणी करें।

जवाबों:


36

यह डिफ़ॉल्ट ट्रेस में तब तक लॉग इन हो जाता है, जब तक यह सक्षम है और इस बीच लुढ़का नहीं है कि यह "स्कीमा परिवर्तन इतिहास" रिपोर्ट में दिखाई देनी चाहिए।

प्रबंधन स्टूडियो में इसे एक्सेस करने के लिए डेटाबेस पर क्लिक करें फिर संदर्भ मेनू चुनें 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घटना को संभालने के लिए संपादित किया और साथ ही दृश्य को गिरा दिया गया था और बदल दिया गया था। सुनिश्चित नहीं हैं कि सर्वर पर अमल न करने से आपका क्या मतलब है? आपको निश्चित रूप से सही उदाहरण से जुड़ने की आवश्यकता है, लेकिन इससे कोई फर्क नहीं पड़ता कि कनेक्शन आपके पास अनुमतियों के अनुसार कहां से आता है।
मार्टिन स्मिथ

धन्यवाद मार्टिन, लेकिन परिणाम अभी भी वही है
xorpower


3
@Xorpower - अच्छा लग रहा है कि ट्रेस फिर से लुढ़क गया है और आपने लगभग 11 घंटे से अधिक पुरानी किसी भी चीज़ का विवरण खो दिया है। डिफ़ॉल्ट ट्रेस केवल 5 फाइलें रखता है और फिर पुराने को हटा देता है। आप सर्वर पर फ़ाइल सिस्टम पर फ़ोल्डर की जाँच करना चाहते हैं, बस यह निश्चित रूप से जांचने के लिए है। आप फ़ोल्डर का रास्ताSELECT path FROM sys.traces where is_default=1
मार्टिन स्मिथ

19

मार्टिन ने पहले ही सर्वश्रेष्ठ एवेन्यू की ओर इशारा किया, प्रशासनिक ऑडिट ट्रेस जो आमतौर पर है (जब तक कि यह स्पष्ट रूप से अक्षम नहीं किया गया है)। यदि आपको व्यवस्थापक ट्रेस में जानकारी नहीं मिली है (यह अक्षम था या इसे पुनर्नवीनीकरण किया गया था) तो आप लॉग बैकअप से जानकारी प्राप्त कर सकते हैं। चूंकि एक उत्पादन डीबी है, मुझे लगता है कि आपके पास एक नियमित बैकअप चक्र है, आवधिक पूर्ण बैकअप और लॉग बैकअप के साथ। आपको एक अलग सर्वर पर, घटना के समय के आसपास डेटाबेस को पुनर्स्थापित करने की आवश्यकता होगी, ताकि डीडीएल वर्तमान बहाल लॉग में हो। फिर 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]लॉगिन 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 में दृश्य की वर्तमान ऑब्जेक्ट आईडी)। लेन-देन आईडी के साथ आप वापस जाते हैं और आरंभ लेनदेन जानकारी प्राप्त करते हैं:

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पासवर्ड जानता है वह कर सकता था।


2
लॉग फ़ाइलों को पढ़ने पर अच्छा टिप। यह काम में आता है अगर कोई डिफ़ॉल्ट निशान को निष्क्रिय कर देता है।
स्टेनली जॉन

यदि लेनदेन SID शून्य है तो क्या होगा?
बेदखल करना

@evencednoise कृपया संबंधित लॉग रिकॉर्ड (एक अलग प्रश्न में) पोस्ट करें। यह अधिक हो सकता है कि एक कारण और लॉग रिकॉर्ड वास्तविक कारण निर्धारित करने में मदद करेंगे।
रेमस रूसु

6

नहीं, जब तक आप इसे डीडीएल ट्रिगर या इस तरह से लॉग इन नहीं करते

आप यह देखना चाहते हैं कि उस डेटाबेस में कौन अधिकार है, या sysadmin / db_owner / ddl_admin भूमिका की सदस्यता। यह चुड़ैल के शिकार के बजाय एक सामान्य समीक्षा के रूप में बेहतर होगा। संभवतः अनधिकृत और अनधिकृत परिवर्तन करने के अधिकारों के साथ अन्य लोग भी हैं


0

यदि आप पहले से ही नहीं हैं, तो आप SQL सर्वर प्रबंधन स्टूडियो में उपलब्ध स्कीमा परिवर्तन इतिहास रिपोर्ट देखना चाहते हैं । ऐसा लगता है कि डिफ़ॉल्ट रूप से SQL सर्वर लॉग बदलता है ( डिफ़ॉल्ट ट्रेस ) और आपको इस रिपोर्ट के माध्यम से उस डेटा को देखने में सक्षम होना चाहिए। केवल दुर्भाग्यपूर्ण बात यह है कि इन ट्रेस फ़ाइलों को समय के साथ स्वचालित रूप से हटा दिया जाता है / लुढ़का जाता है, इसलिए डेटा पहले से ही जा सकता है। सौभाग्य!


वूप्स, माइंड। मुझे लगता है कि मार्टिन स्मिथ ने पहले ही अपने जवाब में इस रिपोर्ट का हवाला दिया था। यदि कोई लिंक मददगार है तो मैं इसे यहाँ छोड़ दूँगा।
मार्क मेडज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.