Veritabanındaki tüm yürütme eylemlerini denetleyen bir veritabanı denetim belirtimine sahip bir SQL Server veritabanımız var.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Bazı sorguların denetim günlüğüne bir sonuç kümesindeki her satır için bir skaler işlev kullanımını yazdığını bulduk. Bu olduğunda, günlük, son dinlenme yerine ETL yapabilmemiz için dolar ve günlüklememizde bir boşluk var.
Maalesef uyumluluk nedeniyle, her EXECUTE
ifadeyi denetlemeyi durduramayız .
Bu soruna yaklaşım için ilk düşüncemiz , etkinliği denetlemek için Sunucu DenetimindeWHERE
madde kullanmaktır . Kod şöyle görünüyordu:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Ne yazık ki, SQL Server ilişkisel IN operatörüne izin vermez (muhtemelen denetim günlüğüne her yazmak zorunda kaldığında sorgulamak istemediği için).
Biz sert kodları saklı yordam yazılmasını önlemek istiyoruz object_id
içinde WHERE
fıkra, ama bu sorunu yaklaşım en iyi yolu mevcut düşünmedir. Dikkate almamız gereken alternatif bir yaklaşım var mı?
Skalar fonksiyon özyinelemeli bir CTE'de kullanıldığında, sorgunun sonuç kümesindeki her satır için denetim günlüğüne yazmasına neden olduğunu fark ettik.
Başka bir veritabanını silemediğimiz veya başka bir veritabanına taşıyamadığımız bir satıcı tarafından teslim edilen bazı Skaler Değerli İşlevler vardır.
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.
- Bu duyduğum skaler UDF'lerin en görkemli yan etkilerinden biri ve çok duydum.