এসকিউএল সার্ভার অডিট ডেটা থেকে স্কেলার মূল্যবান ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ব্যবহার কীভাবে ফিল্টার করবেন?


12

আমাদের কাছে একটি এসকিউএল সার্ভার ডাটাবেস রয়েছে যার একটি ডাটাবেস নিরীক্ষণ বিশদ রয়েছে যা ডাটাবেসের সমস্ত ক্রিয়াকলাপ নিরীক্ষণ করে।

CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])

আমরা খুঁজে পেয়েছি যে কিছু প্রশ্নের ফলাফল ফলাফলের মধ্যে প্রতিটি সারির জন্য একটি স্কেলার ফাংশন ব্যবহারের নিরীক্ষণ লগতে লিখতে হবে। এটি যখন ঘটে তখন লগটি এটি চূড়ান্ত বিশ্রামের স্থানে ইটিএল করার আগে পূর্ণ হয় এবং আমাদের লগিংয়ের মধ্যে আমাদের একটি ফাঁক থাকে।

দুর্ভাগ্যক্রমে সম্মতিজনিত কারণে, আমরা কেবলমাত্র প্রতিটি EXECUTEবিবৃতি নিরীক্ষণ বন্ধ করতে পারি না ।

এই সমস্যাটির দিকে যাওয়ার জন্য আমাদের প্রথম চিন্তাটি হল ক্রিয়াকলাপটি ফিল্টার করার WHEREজন্য সার্ভার অডিট-এর ক্লজ ব্যবহার করা । কোডটি এরকম দেখাচ্ছে:

WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )

দুর্ভাগ্যক্রমে, এসকিউএল সার্ভার অপারেশনাল ইন অপারেটরটিকে অনুমতি দেয় না (সম্ভবত কারণ এটি প্রতিবার নিরীক্ষণ লগতে লিখতে হবে জিজ্ঞাসা করতে চায় না)।

আমরা একটি সঞ্চিত proc যা হার্ড কোড লেখার এড়াতে চাই object_idমধ্যে WHEREদফা, কিন্তু যে সবচেয়ে ভালো উপায় এই সমস্যা কাছে উপর আমাদের বর্তমান চিন্তা হয়। এমন কোন বিকল্প পদ্ধতির কি আমাদের বিবেচনা করা উচিত?

আমরা লক্ষ্য করেছি যে যখন স্কেলার ফাংশনটি পুনরাবৃত্ত সিটিইতে ব্যবহৃত হয়, তখন ফলাফল ফলাফলের প্রতিটি সারিটির জন্য নিরীক্ষার লগতে কোয়েরিটি লেখার কারণ হয়ে থাকে।

কিছু স্কেলার মূল্যবান ফাংশন রয়েছে যা কোনও বিক্রেতার দ্বারা বিতরণ করা হয় যা আমরা মুছতে বা বিকল্প ডাটাবেসে স্থানান্তর করতে পারি না।


6
We've found that some queries will write to the audit log the use of a scalar function for every row in a result set.- আমি স্কেলার ইউডিএফগুলির মধ্যে সবচেয়ে দুর্দান্ত পার্শ্ব প্রতিক্রিয়াগুলির মধ্যে একটি যা আমি শুনেছি এবং আমি অনেক শুনেছি।
এরিক ডার্লিং

3
আপনি আলাদা আলাদা ডাটাবেসে অডিট করতে চান না এমন ইউডিএফ তৈরির কোনও বিকল্প নেই (এটি নিরীক্ষিত নয়) এবং তাদের 3-অংশ-নাম দিয়ে অনুরোধ করছেন?
স্কট হজগিন

@ স্কটহডগিন, আমি কাজটি পছন্দ করি তবে আমাদের পরিস্থিতিতে কিছু স্কেলার মূল্যবান ফাংশন রয়েছে যা কোনও বিক্রেতার দ্বারা সরবরাহ করা হয় যা আমরা কোনও বিকল্প ডাটাবেস মুছতে বা স্থানান্তর করতে পারি না।
মার্ক ইয়ানুচি

নিম্নলিখিত অনুসারে যারা ভাবছেন তারা কী কারণে কেসকে ফলাফলের জন্য প্রতিটি সারির জন্য নিরীক্ষণ লগতে লিখতে বাধ্য করে; আমরা লক্ষ্য করেছি যে যখন স্কেলার ফাংশনটি পুনরাবৃত্ত সিটিইতে ব্যবহৃত হয় তখন তা ঘটেছিল।
মার্ক ইন্নুচি

উত্তর:


6

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

প্রথমত, সর্বাধিক জেনেরিক পদ্ধতির মধ্যে সমস্ত স্কেলার ইউডিএফ ফিল্টার করা হয়। class_typeঅডিট ক্ষেত্রটি ব্যবহার করে আপনি এটি করতে পারেন । ডকুমেন্টেশনটি বোঝায় যে এই ক্ষেত্রটি VARCHAR(2), তবে এটি কোনও স্ট্রিং নির্দিষ্ট করার অনুমতি দেয় না। তবে, আমি নিম্নলিখিত কাজগুলি করতে পেরেছি:

ALTER SERVER AUDIT [servAudit]
WHERE ([class_type] <> 20038); -- EXECUTE Scalar UDF

(সেই তদন্তের আরও তথ্য এখানে: সার্ভার অডিট রহস্য: ফিল্টারিং ক্লাস_ টাইপ এমএসজি 25713 পেয়েছে )

পরবর্তী সর্বাধিক জেনেরিক পদ্ধতির কোনও বিকল্প নয় কারণ এটি বলা হয়েছিল যে এটি একটি বিক্রেতা-সরবরাহিত ডাটাবেস এবং সুতরাং কোনও পরিবর্তন করা যাবে না। সুতরাং আমি যে শেষ আবরণ করব।

সর্বাধিক জেনেরিক পদ্ধতির (তবে একটি যা অবশ্যই কাজ করে) হ'ল নির্দিষ্ট ফাংশনটির নাম ফিল্টার আউট করা:

ALTER SERVER AUDIT [servAudit]
WHERE ([object_name]<>'function_name');

বা, যদি একাধিক নাম:

ALTER SERVER AUDIT [servAudit]
WHERE ([object_name]<>'function_name1' AND [object_name]<>'function_name2');

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

অবশেষে, অন্যদের জন্য যারা এই পরিস্থিতির মুখোমুখি হন এবং পরিবর্তনগুলি করা থেকে বিরত নয়: আপনি তাদের নিজস্ব স্কিমায় ফাংশন স্থাপন করতে পারেন এবং ঠিক সেই স্কিমাকে ফিল্টার করে নিতে পারেন। পৃথকভাবে ফাংশনগুলি ফিল্টার করার চেয়ে এটি আরও সাধারণ। ধরে নিই যে আপনি একটি স্কিমা নামের তৈরি করেছেন fnএবং এতে ফাংশন (গুলি) রাখুন:

ALTER SERVER AUDIT [servAudit]
WHERE ([schema_name]<>'fn');

ALSO, প্রশ্নের নিম্নলিখিত দুটি মন্তব্য সম্পর্কে:

দুর্ভাগ্যক্রমে, এসকিউএল সার্ভার অপারেশনাল ইন অপারেটরটিকে অনুমতি দেয় না (সম্ভবত কারণ এটি প্রতিবার নিরীক্ষণ লগতে লিখতে হবে জিজ্ঞাসা করতে চায় না)।

এবং:

আমরা কোনও স্টোর করা প্রুক লেখা এড়াতে চাই যা WHOEE ক্লজটিতে অবজেক্ট_আইডকে হার্ড কোড করে

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


এই প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ। আমরা এই পরিবর্তনটি বাস্তবায়নের প্রক্রিয়াতে রয়েছি এবং যখন আমরা এটি নিশ্চিত করি যে এটি আমাদের পরিবেশে কার্যকর হয় তখন আমি এই উত্তরটি গ্রহণ করব।
মার্ক ইন্নুচি

1
@ মারকিয়ানুচি ধন্যবাদ! এছাড়াও, আমি আমার আদর্শ পরামর্শে একটি ছোটখাটো বাগ ঠিক করেছি। আমি যেখানে পরীক্ষা-নিরীক্ষা করে অনুলিপি করেছিলাম সেখানে কোনও বাট ফাংশন না করে ফাংশনগুলির জন্য ফিল্টার করছি। আমি আমার উত্তর =হতে পরিবর্তন <>। আমি এটিও পরীক্ষা করেছি এবং এটি বিজ্ঞাপন হিসাবে কাজ করে :-)
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.