Nous avons une base de données SQL Server qui a une spécification d'audit de base de données qui vérifie toutes les actions d'exécution sur la base de données.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Nous avons constaté que certaines requêtes écriront dans le journal d'audit l'utilisation d'une fonction scalaire pour chaque ligne d'un jeu de résultats. Lorsque cela se produit, le journal se remplit avant que nous puissions l'ETL dans son lieu de repos final et nous avons une lacune dans notre journalisation.
Malheureusement, pour des raisons de conformité, nous ne pouvons pas simplement arrêter l'audit de chaque EXECUTE
déclaration.
Notre première pensée pour l'approche de ce problème est d'utiliser la WHERE
clause sur l' audit du serveur pour filtrer l'activité. Le code ressemblait à ceci:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Malheureusement, SQL Server n'autorise pas l'opérateur relationnel IN (probablement parce qu'il ne veut pas interroger chaque fois qu'il doit écrire dans le journal d'audit).
Nous aimerions éviter d'écrire un proc stocké qui code en dur object_id
la WHERE
clause, mais c'est notre réflexion actuelle sur la meilleure façon d'aborder ce problème. Y a-t-il une autre approche que nous devrions envisager?
Nous avons remarqué que lorsque la fonction scalaire est utilisée dans un CTE récursif, elle entraîne l'écriture de la requête dans le journal d'audit pour chaque ligne du jeu de résultats.
Certaines fonctions à valeur scalaire sont fournies par un fournisseur que nous ne pouvons pas supprimer ou déplacer vers une autre base de données.
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.
- C'est l'un des effets secondaires les plus magnifiques des FDU scalaires que j'ai jamais entendu, et j'en ai beaucoup entendu.