কীভাবে স্কিমা পরিবর্তন ঘটে তা নির্ধারণ করা হচ্ছে?


21

গতকাল কিছু খারাপ ঘটেছে।

কিছুক্ষণ আগে তৈরি করা হয়েছে এমন একটি ভিউ কারও দ্বারা সংশোধন করা হয়েছিল যা শেষ পর্যন্ত প্রতিবেদনগুলি ভেঙে দেয়। দুর্ভাগ্যবশত। কেউ (জেনেশুনে বা অজান্তেই) উত্পাদনের ডাটাবেসে এই পরিবর্তনটি করেছে।

আমার প্রশ্ন: এমন কোনও উপায় আছে (স্ক্রিপ্ট / সফটওয়্যার / ফ্রিওয়্যার ইত্যাদি) যার মাধ্যমে আমরা জানতে পারি কে (ব্যবহারকারীর নাম) এই পরিবর্তনটি করেছে, যাতে আমি সেই ব্যবহারকারীর জন্য প্রোডাকশন ডেটাবেজে অ্যাক্সেস প্রত্যাহার করতে পারি।

যদি আমার প্রশ্নটি অস্পষ্ট থাকে তবে মন্তব্য করুন।

উত্তর:


36

এটি ডিফল্ট ট্রেসে লগইন হয়ে যায়, যতক্ষণ না এটি সক্ষম থাকে এবং এর মধ্যে এটি ঘূর্ণায়িত হয় না যতক্ষণ না এটি "স্কিমা পরিবর্তন ইতিহাস" প্রতিবেদনে প্রদর্শিত হবে।

ম্যানেজমেন্ট স্টুডিওতে এটি অ্যাক্সেস করতে ডেক্সটবেসে ক্লিক করুন তারপরে প্রসঙ্গ মেনু থেকে চয়ন করুন Reports -> Standard Reports -> Schema Changes History

টিএসকিউএল এর মাধ্যমে একই তথ্য পুনরুদ্ধার করতে আপনি ব্যবহার করতে পারেন

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*/ )

ধন্যবাদ মার্টিন, আমি আমার ভিউয়ের সাথে 'এফইউ' প্রতিস্থাপন করে কোয়েরি সম্পাদন করেছি তবে তাতে কিছুই ফিরে আসে নি। কোন ধারণা কেন এমন হয়? আমি সার্ভারে কার্যকর হইনি, যদিও
xorpower

1
@ ক্ষয় শক্তি - আমি Object:Createdইভেন্টটি পরিচালনা করতে এটি সম্পাদনা করেছি পাশাপাশি দেখা যায় যে পরিবর্তনটি পরিবর্তিত হওয়ার পরিবর্তে দৃশ্যটি বাদ দেওয়া এবং তৈরি করা হয়েছিল। আপনি সার্ভারে এক্সিকিউট না করার অর্থ কী তা নিশ্চিত নন? আপনার অবশ্যই অবশ্যই সঠিক উদাহরণের সাথে সংযোগ স্থাপন করা দরকার তবে যতক্ষণ আপনি অনুমতি পেয়েছেন সংযোগটি কোথা থেকে আসে তা বিবেচনা করে না।
মার্টিন স্মিথ

ধন্যবাদ মার্টিন, তবে ফলাফল এখনও একইরকম থেকে যায়
xforp


3
@ ক্ষুদ্র শক্তি - ভাল লেগেছে দেখে মনে হচ্ছে যে এরপরে ততক্ষণে rolুকে পড়েছে এবং আপনি প্রায় 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]আপনি চান লগইন এসআইডি।

আর একটি সম্ভাবনা হ'ল যে লেনদেনটি আপনি চান সেই ভিউতে একটি এসসিএইচএম অর্জন করেছে:

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 দ্বারা অনুসরণ করা হয়েছে তারপরে ক্রিয়েট দ্বারা অবজেক্ট আইডি সম্ভবত পরিবর্তিত হয়েছিল, তবে কমপক্ষে আপনি লেনদেনটি শেষটি করেছেন যা তৈরি হয়েছিল (পুনরুদ্ধার করা ডিবিতে ভিউটির বর্তমান অবজেক্ট আইডি)। লেনদেন আইডির সাহায্যে আপনি ফিরে যান এবং সূচনা লেনদেনের তথ্যটি পুনরুদ্ধার করুন:

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

[লেনদেনের এসআইডি] আবার আপনার লোক। SUSER_SNAMEলগইন এসআইডি থেকে লগইন নামটি পুনরুদ্ধার করতে ব্যবহার করুন । যদি এসআইডি 0x01 হয় তবে এর অর্থ লগইন হয়েছিল sa, যার অর্থ saপাসওয়ার্ড জেনে থাকা যে কোনও ব্যক্তি এটি করতে পারত।


2
লগ ফাইলগুলি পড়ার জন্য ভাল টিপ। যদি কেউ ডিফল্ট ট্রেস অক্ষম করে থাকে তবে এটি কার্যকর হবে।
স্ট্যানলি জনস

যদি লেনদেন এসআইডি নাল হয়?
উচ্ছেদ হয়েছে

@ দায়িত্বরত দয়া করে সম্পর্কিত লগ রেকর্ডগুলি পোস্ট করুন (একটি পৃথক প্রশ্নে)। এটি আরও বেশি হতে পারে যে একটি কারণ এবং লগ রেকর্ডগুলি প্রকৃত কারণ নির্ধারণে সহায়তা করবে।
রিমাস রুসানু

6

না, যদি না আপনি এটি ডিডিএল ট্রিগার বা এর মাধ্যমে লগইন করেন

আপনি যে ডাটাবেসে বিকল্প হিসাবে বা সিসাদমিন / db_owner / ddl_admin ভূমিকা সদস্যতা হিসাবে দেখতে চান। এটি ডাইনি শিকারের চেয়ে সাধারণ পর্যালোচনা হিসাবে ভাল হবে। অনুমোদনপ্রাপ্ত এবং অননুমোদিত পরিবর্তনগুলি করার অধিকার রয়েছে এমন অন্যান্য ব্যক্তিরাও সম্ভবত রয়েছেন


0

আপনি যদি ইতিমধ্যে না থাকেন তবে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে উপলব্ধ স্কিমা পরিবর্তন ইতিহাস প্রতিবেদনটি পরীক্ষা করে দেখতে চাইতে পারেন । দেখে মনে হচ্ছে এসকিউএল সার্ভারটি ডিফল্ট ( ডিফল্ট ট্রেস ) দ্বারা পরিবর্তনগুলি লগ করে এবং আপনার এই প্রতিবেদনের মাধ্যমে সেই ডেটাটি দেখতে সক্ষম হওয়া উচিত। দুর্ভাগ্যজনক বিষয়টি হ'ল সময় হিসাবে এই ট্রেস ফাইলগুলি স্বয়ংক্রিয়ভাবে মোছা / ঘূর্ণিত হয়ে যায়, সুতরাং ডেটা ইতিমধ্যে চলে যেতে পারে। শুভকামনা!


ওফ, কিছু মনে করবেন না। আমি দেখছি মার্টিন স্মিথ ইতিমধ্যে তার উত্তরে এই প্রতিবেদনটি উল্লেখ করেছে। লিঙ্কগুলির যে কোনও ক্ষেত্রে সহায়ক হলে আমি এটিকে এখানে রেখে দেব leave
মার্ক মাদেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.