আমাদের কাছে একটি এসকিউএল সার্ভার ডাটাবেস রয়েছে যার একটি ডাটাবেস নিরীক্ষণ বিশদ রয়েছে যা ডাটাবেসের সমস্ত ক্রিয়াকলাপ নিরীক্ষণ করে।
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
দফা, কিন্তু যে সবচেয়ে ভালো উপায় এই সমস্যা কাছে উপর আমাদের বর্তমান চিন্তা হয়। এমন কোন বিকল্প পদ্ধতির কি আমাদের বিবেচনা করা উচিত?
আমরা লক্ষ্য করেছি যে যখন স্কেলার ফাংশনটি পুনরাবৃত্ত সিটিইতে ব্যবহৃত হয়, তখন ফলাফল ফলাফলের প্রতিটি সারিটির জন্য নিরীক্ষার লগতে কোয়েরিটি লেখার কারণ হয়ে থাকে।
কিছু স্কেলার মূল্যবান ফাংশন রয়েছে যা কোনও বিক্রেতার দ্বারা বিতরণ করা হয় যা আমরা মুছতে বা বিকল্প ডাটাবেসে স্থানান্তর করতে পারি না।
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.
- আমি স্কেলার ইউডিএফগুলির মধ্যে সবচেয়ে দুর্দান্ত পার্শ্ব প্রতিক্রিয়াগুলির মধ্যে একটি যা আমি শুনেছি এবং আমি অনেক শুনেছি।