हमारे पास एक SQL सर्वर डेटाबेस है जिसमें एक डेटाबेस ऑडिट विनिर्देश है जो डेटाबेस पर सभी कार्यों को निष्पादित करता है।
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
हमने पाया है कि कुछ प्रश्न परिणाम सेट में प्रत्येक पंक्ति के लिए एक स्केलर फ़ंक्शन के उपयोग के लिए ऑडिट को लिखेंगे। जब ऐसा होता है, तो लॉग भरने से पहले हम इसे अंतिम रूप देने वाले स्थान पर ETL कर सकते हैं और हमारे लॉगिंग में एक अंतर है।
दुर्भाग्य से अनुपालन कारणों के कारण, हम बस हर EXECUTE
बयान का ऑडिट नहीं कर सकते ।
इस समस्या के लिए हमारा पहला विचार यह है कि गतिविधि को फ़िल्टर करने के WHERE
लिए सर्वर ऑडिट पर क्लॉज़ का उपयोग किया जाए । कोड इस तरह दिखता था:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
दुर्भाग्य से, एसक्यूएल सर्वर रिलेशनल इन ऑपरेटर की अनुमति नहीं देता है (शायद इसलिए कि यह हर बार क्वेरी को ऑडिट लॉग में लिखना नहीं चाहता है)।
हम संग्रहीत संग्रह लिखने से बचना चाहते हैं, जो क्लॉज़ object_id
में कठिन कोड है WHERE
, लेकिन इस समस्या को हल करने के लिए सबसे अच्छी तरह से हमारी वर्तमान सोच है। क्या कोई वैकल्पिक दृष्टिकोण है जिस पर हमें विचार करना चाहिए?
हमने देखा है कि जब पुनरावर्ती CTE में स्केलर फ़ंक्शन का उपयोग होता है, तो यह परिणाम सेट में प्रत्येक पंक्ति के लिए ऑडिट लॉग को लिखने के लिए क्वेरी का कारण बनता है।
कुछ स्केलेर वैल्यूड फंक्शंस हैं जो एक वेंडर द्वारा दिए जाते हैं जिसे हम डिलीट नहीं कर सकते हैं या वैकल्पिक डेटाबेस में नहीं जा सकते हैं।
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.
- यह स्केलर यूडीएफ के सबसे शानदार साइड इफेक्ट्स में से एक है जो मैंने कभी सुना है, और मैंने बहुत सुना है।