একটি এসকিউএল সার্ভারের টেবিলের জন্য পরিবর্তনগুলি পরীক্ষা করুন?


142

ট্রিগার ব্যবহার না করে বা কোনও উপায়ে ডাটাবেসের কাঠামো পরিবর্তন না করে কোনও টেবিলের পরিবর্তনের জন্য কীভাবে আমি এসকিউএল সার্ভার ডাটাবেস পর্যবেক্ষণ করতে পারি? আমার পছন্দের প্রোগ্রামিং পরিবেশটি নেট এবং সি #।

আমি যে কোনও এসকিউএল সার্ভার 2000 এসপি 4 বা আরও নতুন সমর্থন করতে সক্ষম হতে চাই । আমার অ্যাপ্লিকেশনটি হ'ল অন্য কোম্পানির পণ্যের জন্য ডেটা ভিজুয়ালাইজেশন olt আমাদের গ্রাহক বেস হাজারে, তাই আমি প্রতিটি ইনস্টলেশনটিতে তৃতীয় পক্ষের বিক্রেতার টেবিলটি সংশোধন করে প্রয়োজনীয়তা রাখতে চাই না।

দ্বারা "একটি টেবিল থেকে পরিবর্তন" আমি টেবিল ডেটাতে গড় পরিবর্তন, টেবিল কাঠামো পরিবর্তন না।

শেষ পর্যন্ত, আমি পরিবর্তনটি অন্তর সময়ে পরিবর্তনগুলি পরীক্ষা করার পরিবর্তে আমার অ্যাপ্লিকেশনটিতে একটি ইভেন্ট ট্রিগার করতে চাই।


আমার প্রয়োজনীয়তা (কোনও ট্রিগার বা স্কিমা পরিবর্তন নয়, এসকিউএল সার্ভার 2000 এবং 2005) প্রদত্ত কর্মের সর্বোত্তম কোর্সটি টি-এসকিউএল-তেBINARY_CHECKSUM ফাংশনটি ব্যবহার করে বলে মনে হচ্ছে । আমি যেভাবে বাস্তবায়নের পরিকল্পনা করছি তা হ'ল:

প্রতি এক্স সেকেন্ডে নিম্নলিখিত কোয়েরিটি চালান:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

এবং এটি সঞ্চিত মানের তুলনায় তুলনা করুন। মানটি যদি পরিবর্তিত হয়, সন্ধান করে টেবিলের সারিটি সারি দিয়ে ক্যোরিটি ব্যবহার করুন:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

এবং সঞ্চিত মানের তুলনায় ফিরে আসা চেকসামগুলি তুলনা করুন।


3
তারা কি তাদের সারিগুলিতে একটি সর্বশেষ-সংশোধিত টাইমস্ট্যাম্প লাগিয়েছিল, তাই না?
zmbq

রেকর্ডের জন্য, সংস্করণ সমর্থনটি এসকিউএল সার্ভার 2005 বা আরও নতুন। আমি এসকিউএল সার্ভারের পরিষেবা ব্রোকার বৈশিষ্ট্যটি একবার দেখে নেব।
মার্কো গিগনার্ড

উত্তর:


97

CHECKSUM কমান্ডটি একবার দেখুন:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

সারণীর বিষয়বস্তু পরিবর্তিত না হওয়া পর্যন্ত এটি প্রতিবার চালানোর সময় একই সংখ্যাটি ফিরিয়ে দেবে। আরও তথ্যের জন্য এই আমার পোস্ট দেখুন:

চেকসাম

টেবিলগুলি পরিবর্তিত হওয়ার সাথে সাথে আমি ক্যাশে নির্ভরতা পুনর্নির্মাণের জন্য এখানে কীভাবে ব্যবহার করেছি:
ASP.NET 1.1 ডাটাবেস ক্যাশে নির্ভরতা (ট্রিগার ছাড়াই)


2
চেকসামগুলি শেষ পর্যন্ত ব্যর্থ হতে পারে এবং করতে পারে। যদি আপনার সিস্টেমটি গ্রহণ করে যে দুটি ভাল সেট ডেটা আপনার চেকসামের চেয়ে একই চেকসামের ফলস্বরূপ। যে কারণে, আমাদের বেশিরভাগ সিস্টেমে আমাকে চেকসাম থেকে সরে যেতে হয়েছিল ...
এলপেইন্স

@ এলপেইনস আপনি কি আপনার বক্তব্যটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
পেট্রোসমি

1
@ পেট্রোস্মাম আমি নিশ্চিত নন যে আপনি কী বিশেষভাবে আমাকে বিস্তৃত করতে চান তবে আমি চেষ্টা করব। কল্পনা করুন আপনার কয়েক শ রেকর্ড সহ একটি টেবিল রয়েছে, আপনি চেকসাম হিসাবে মূলত একটি পূর্ণসংখ্যা তৈরি করেন, এটি কতবার সংঘর্ষে চলেছে? আমার ক্ষেত্রে, আমি এটি প্রায় 10 টি টেবিলের সাথে করছিলাম, যা কয়েকশত রেকর্ড সহ। আমার প্রতিদিন কমপক্ষে একটি সংঘর্ষ হয়েছিল। এই অন্য উত্তর চেক stackoverflow.com/questions/14450415/...
LPains

29

দুর্ভাগ্যক্রমে CHECKSUM পরিবর্তনগুলি সনাক্ত করতে সর্বদা সঠিকভাবে কাজ করে না

এটি কেবলমাত্র একটি আদিম চেকসাম এবং কোনও চক্রীয় রিডানডেন্সি চেক (সিআরসি) গণনা নয়।

অতএব আপনি সমস্ত পরিবর্তন সনাক্ত করতে এটি ব্যবহার করতে পারবেন না, উদাহরণস্বরূপ প্রতিসম পরিবর্তনের ফলে একই CHECKSUM!

E. g। এর সাথে সমাধানটি CHECKSUM_AGG(BINARY_CHECKSUM(*))সর্বদা 3 টি টেবিলের জন্য বিভিন্ন সামগ্রী সহ 0 সরবরাহ করবে:


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!


5
এটি আসলে কোনও উত্তর নয়, এটি একটি "আপনার পরামর্শ কাজ করে না"।
ক্রিস্টিয়ানপ

1
এটি BINARY_CHECKSUM এর পূর্বে DISINCT কীওয়ার্ড ব্যবহার করে সদৃশ ডেটার প্রতিকার করা যেতে পারে। এখানে আরও কয়েকটি সমস্যা দেখা গেছে তবে ঠিক সাধারণ পরিস্থিতি নয়।
pblack

25

আপনি ট্রিগার ব্যবহার করতে চান না কেন? আপনি যদি এগুলি সঠিকভাবে ব্যবহার করেন তবে এগুলি একটি ভাল জিনিস। আপনি যদি তাদেরকে রেফারেনশিয়াল অখণ্ডতা প্রয়োগের উপায় হিসাবে ব্যবহার করেন যা তারা যখন ভাল থেকে খারাপ দিকে যায়। তবে আপনি যদি এগুলি নিরীক্ষণের জন্য ব্যবহার করেন তবে এগুলি সত্যই নিষিদ্ধ হিসাবে বিবেচিত হবে না।


20

আপনার কতবার পরিবর্তনগুলি পরীক্ষা করতে হবে এবং ডাটাবেসে থাকা টেবিলগুলি কত বড় (সারি আকারের বিচারে) হবে? আপনি যদি CHECKSUM_AGG(BINARY_CHECKSUM(*))জন দ্বারা প্রস্তাবিত পদ্ধতিটি ব্যবহার করেন তবে এটি নির্দিষ্ট টেবিলের প্রতিটি সারি স্ক্যান করবে। NOLOCKইঙ্গিতটি সাহায্য করে, কিন্তু একটা বিরাট ডাটাবেস উপর, আপনি কি এখনও যে সারি আঘাত করছে। আপনাকে প্রতিটি সারির জন্য চেকসাম সংরক্ষণ করতে হবে যাতে আপনি জানান যে একটি পরিবর্তন হয়েছে।

আপনি কি অন্য একটি কোণ থেকে এটি বিবেচনা করেছেন? আপনি যদি ট্রিগার যুক্ত করার জন্য স্কিমাটি সংশোধন করতে না চান, (যা বোঝায় যে এটি আপনার ডাটাবেস নয়), আপনি কি অ্যাপ্লিকেশন বিক্রেতার সাথে কাজ করার কথা বিবেচনা করেছেন যা ডাটাবেস তৈরি করে?

তারা এমন একটি এপিআই বাস্তবায়ন করতে পারে যা ডেটা পরিবর্তিত হয়েছে এমন অ্যাকসেসরি অ্যাপ্লিকেশনগুলিকে অবহিত করার জন্য একটি প্রক্রিয়া সরবরাহ করে। এটি কোনও নোটিফিকেশন টেবিলে লেখার মতো সহজ হতে পারে যা কোন টেবিলটি এবং কোন সারিটি সংশোধন করা হয়েছিল তা তালিকাভুক্ত করে। এটি ট্রিগার বা অ্যাপ্লিকেশন কোডের মাধ্যমে প্রয়োগ করা যেতে পারে। আপনার দিক থেকে, এটি কোনও ব্যাপার নয়, আপনার একমাত্র উদ্বেগ পর্যায়ক্রমিক ভিত্তিতে বিজ্ঞপ্তি টেবিলটি স্ক্যান করা হবে। ডাটাবেসে পারফরম্যান্স হিট পরিবর্তনের জন্য প্রতিটি সারি স্ক্যান করার চেয়ে অনেক কম হবে।

হার্ড অংশটি অ্যাপ্লিকেশন বিক্রেতাকে এই বৈশিষ্ট্যটি বাস্তবায়নের জন্য বোঝানো হবে। যেহেতু এটি পুরোপুরি এসকিউএল-এর মাধ্যমে ট্রিগারগুলির মাধ্যমে পরিচালনা করা যায়, আপনি ট্রিগারগুলি লিখে এবং পরীক্ষা করে এবং তারপরে অ্যাপ্লিকেশন বিক্রেতার কাছে কোড আনার মাধ্যমে আপনি তাদের বেশিরভাগ কাজ করতে পারেন। বিক্রেতাকে ট্রিগারগুলিকে সমর্থন করে, এটি এমন পরিস্থিতি প্রতিরোধ করে যেখানে আপনার ট্রিগার যুক্ত করা অনিচ্ছাকৃতভাবে বিক্রেতার দ্বারা সরবরাহ করা ট্রিগারকে প্রতিস্থাপন করে।


18

দুর্ভাগ্যক্রমে, আমি মনে করি না যে এসকিউএল 2000 এ করার কোনও পরিষ্কার উপায় আছে। যদি আপনি এসকিউএল সার্ভার 2005 (এবং তারপরে) এর সাথে আপনার প্রয়োজনীয়তাগুলি সংকীর্ণ করেন তবে আপনি ব্যবসায়ে রয়েছেন। আপনি SQLDependencyক্লাসটি ব্যবহার করতে পারেন System.Data.SqlClientএসকিউএল সার্ভার (ADO.NET) এ ক্যোয়ারী বিজ্ঞপ্তিগুলি দেখুন ।


16

একটি ডিটিএস জব (বা উইন্ডোজ পরিষেবা দ্বারা শুরু করা একটি চাকরী) রয়েছে যা একটি নির্দিষ্ট বিরতিতে চলে। প্রতিবার এটি চালানোর পরে, এটি সিস্টেম INFORMATION_SCHEMA টেবিলগুলি ব্যবহার করে প্রদত্ত টেবিল সম্পর্কে তথ্য পায় এবং ডেটা সংগ্রহস্থলে এই ডেটাটি রেকর্ড করে। পূর্ববর্তী সময়ে ফিরে আসা ডেটার সাথে টেবিলের কাঠামোর সাথে সম্পর্কিত ডেটা তুলনা করুন। যদি এটি আলাদা হয় তবে আপনি জানেন যে কাঠামোটি পরিবর্তন হয়েছে।

টেবিল এবিসি-র সমস্ত কলাম সম্পর্কিত তথ্য ফেরত দেওয়ার উদাহরণ ক্যোয়ারী (আদর্শভাবে আপনি চান INFORMATION_SCHEMA টেবিল থেকে কেবলমাত্র কলামগুলি তালিকাবদ্ধ করছে * পরিবর্তে * নির্বাচন করুন ** যেমন আমি এখানে করি):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

আপনি "টেবিলে পরিবর্তনগুলি" ঠিক কীভাবে সংজ্ঞায়িত করেন তার উপর নির্ভর করে আপনি বিভিন্ন কলাম এবং INFORMATION_SCHEMA দর্শনগুলি নিরীক্ষণ করবেন।


2
প্রশ্নটি টেবিলের ডেটা পরিবর্তন এবং তথ্য_স্কেমার মধ্যে রয়েছে সারণির স্কিমা (কলাম সংজ্ঞা)।
খুব

13

বন্য অনুমান এখানে: আপনি যদি তৃতীয় পক্ষের টেবিলগুলি সংশোধন করতে না চান, আপনি কি একটি দৃষ্টিভঙ্গি তৈরি করতে পারেন এবং তারপরে সেই দৃশ্যে ট্রিগার রাখতে পারেন?


6

সর্বশেষ কমিটের তারিখটি পরীক্ষা করুন। প্রতিটি ডাটাবেসের একটি প্রতিশ্রুতিবদ্ধ হওয়ার সময় একটি ইতিহাস থাকে। আমি বিশ্বাস করি এটির এসিডি কমপ্লায়েন্সের একটি মান।


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