Tenemos una base de datos SQL Server que tiene una especificación de auditoría de base de datos que audita todas las acciones de ejecución en la base de datos.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Hemos encontrado que algunas consultas escribirán en el registro de auditoría el uso de una función escalar para cada fila en un conjunto de resultados. Cuando esto sucede, el registro se llena antes de que podamos colocarlo en su lugar de descanso final y tenemos un espacio en nuestro registro.
Desafortunadamente, debido a razones de cumplimiento, no podemos simplemente dejar de auditar cada EXECUTE
declaración.
Nuestro primer pensamiento para el enfoque de este problema es usar una WHERE
cláusula en la Auditoría del servidor para filtrar la actividad. El código se veía así:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Desafortunadamente, SQL Server no permite el operador IN relacional (probablemente porque no quiere consultar cada vez que tiene que escribir en el registro de auditoría).
Nos gustaría evitar escribir un proceso almacenado que codifique object_id
en la WHERE
cláusula, pero ese es nuestro pensamiento actual sobre la mejor manera de abordar este problema. ¿Existe un enfoque alternativo que deberíamos considerar?
Hemos observado que cuando la función escalar está en uso en un CTE recursivo, hace que la consulta escriba en el registro de auditoría para cada fila del conjunto de resultados.
Hay algunas funciones de valor escalar entregadas por un proveedor que no podemos eliminar o mover a una base de datos alternativa.
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.
- Ese es uno de los efectos secundarios más magníficos de los UDF escalares que he escuchado, y he escuchado mucho.