Kami memiliki database SQL Server yang memiliki spesifikasi audit database yang mengaudit semua tindakan yang dilakukan pada database.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Kami telah menemukan bahwa beberapa pertanyaan akan menulis ke audit log penggunaan fungsi skalar untuk setiap baris di set hasil. Ketika ini terjadi, log terisi sebelum kita bisa ETL ke tempat peristirahatan terakhir dan kita memiliki celah dalam pencatatan kita.
Sayangnya karena alasan kepatuhan, kami tidak bisa berhenti mengaudit setiap EXECUTE
pernyataan.
Pikiran pertama kami untuk pendekatan masalah ini adalah menggunakan WHERE
klausa pada Server Audit untuk menyaring aktivitas. Kode tersebut terlihat seperti ini:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Sayangnya, SQL Server tidak mengizinkan operator IN relasional (mungkin karena ia tidak ingin meminta setiap kali harus menulis ke log audit).
Kami ingin menghindari penulisan proc yang tersimpan yang kode kerasnya ada object_id
dalam WHERE
klausa, tetapi itulah pemikiran kami saat ini tentang cara terbaik untuk mendekati masalah ini. Apakah ada pendekatan alternatif yang harus kita pertimbangkan?
Kami telah memperhatikan bahwa ketika fungsi skalar digunakan dalam CTE rekursif, maka itu menyebabkan permintaan untuk menulis ke log audit untuk setiap baris dalam hasil yang ditetapkan.
Ada beberapa Fungsi Berharga Skalar yang dikirimkan oleh vendor yang tidak dapat kami hapus atau pindahkan ke database alternatif.
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.
- Itulah salah satu efek samping paling menakjubkan dari skalar UDF yang pernah saya dengar, dan saya sering mendengar.