У нас есть база данных SQL Server, которая имеет спецификацию аудита базы данных, которая проверяет все выполняемые действия в базе данных.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Мы обнаружили, что некоторые запросы записывают в журнал аудита использование скалярной функции для каждой строки в наборе результатов. Когда это происходит, журнал заполняется до того, как мы сможем поместить его в место последнего упокоения, и у нас есть пробел в нашем журнале.
К сожалению, из-за соображений соответствия, мы не можем просто прекратить проверку каждого 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.
- Это один из самых великолепных побочных эффектов скалярных UDF, которые я когда-либо слышал, и я много слышал.