У нас є база даних 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 не дозволяє реляційний оператор IN (можливо, тому що він не хоче запитувати кожен раз, коли він повинен записувати в журнал аудиту).
Ми хотіли б уникнути написання збережена процедура , яка кодує жорсткі 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.
- Це один із найчудовіших побічних ефектів скалярних АДС, які я коли-небудь чув, і я чув багато.