我们有一个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.
-这是我所听过的标量UDF的最宏伟的副作用之一,而且我已经听到很多。