เรามีฐานข้อมูล SQL Server ซึ่งมีข้อกำหนดการตรวจสอบฐานข้อมูลที่ตรวจสอบการดำเนินการทั้งหมดในฐานข้อมูล
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' )
น่าเสียดายที่ SQL Server ไม่อนุญาตให้ตัวดำเนินการสัมพันธ์ (อาจเป็นเพราะมันไม่ต้องการสอบถามทุกครั้งที่มีการเขียนไปยังบันทึกการตรวจสอบ)
เราต้องการหลีกเลี่ยงการเขียน proc ที่เก็บไว้ซึ่งเป็นรหัสที่ยากobject_id
ในWHERE
ข้อ แต่นั่นคือความคิดของเราในปัจจุบันเกี่ยวกับวิธีที่ดีที่สุดในการแก้ไขปัญหานี้ มีวิธีอื่นที่เราควรพิจารณาหรือไม่?
เราสังเกตเห็นว่าเมื่อฟังก์ชั่นสเกลาร์ถูกใช้ใน CTE แบบเรียกซ้ำดังนั้นมันจะทำให้แบบสอบถามเขียนไปยังบันทึกการตรวจสอบสำหรับทุกแถวในชุดผลลัพธ์
มีฟังก์ชั่น Scalar Valued บางฟังก์ชั่นที่จัดส่งโดยผู้จำหน่ายซึ่งเราไม่สามารถลบหรือย้ายไปยังฐานข้อมูลอื่นได้
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.
- นั่นเป็นหนึ่งในผลข้างเคียงที่ยอดเยี่ยมที่สุดของ UDF สเกลาร์ที่ฉันเคยได้ยินและฉันได้ยินมามาก