Wir haben eine SQL Server-Datenbank mit einer Datenbankprüfspezifikation, die alle ausgeführten Aktionen auf der Datenbank prüft.
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
Wir haben festgestellt, dass einige Abfragen die Verwendung einer Skalarfunktion für jede Zeile in einer Ergebnismenge in das Überwachungsprotokoll schreiben. In diesem Fall füllt sich das Protokoll, bevor wir es in seine letzte Ruhestätte ETL können, und wir haben eine Lücke in der Protokollierung.
Leider können wir aus Compliance-Gründen nicht einfach aufhören, jede EXECUTE
Aussage zu prüfen .
Unser erster Gedanke zur Lösung dieses Problems ist die Verwendung der WHERE
Klausel in der Serverüberwachung , um die Aktivität herauszufiltern. Der Code sah folgendermaßen aus:
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
Leider lässt SQL Server keinen relationalen IN-Operator zu (wahrscheinlich, weil nicht jedes Mal abgefragt werden soll, wenn in das Überwachungsprotokoll geschrieben werden muss).
Wir möchten es vermeiden, einen gespeicherten Proc zu schreiben, der das object_id
in der WHERE
Klausel fest codiert , aber das ist unsere derzeitige Überlegung, wie wir dieses Problem am besten angehen können. Gibt es einen alternativen Ansatz, den wir berücksichtigen sollten?
Wir haben festgestellt, dass bei Verwendung der Skalarfunktion in einem rekursiven CTE die Abfrage für jede Zeile in der Ergebnismenge in das Überwachungsprotokoll geschrieben wird.
Es gibt einige skalare Funktionen, die von einem Anbieter bereitgestellt werden und die nicht gelöscht oder in eine alternative Datenbank verschoben werden können.
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.
- Das ist einer der großartigsten Nebenwirkungen von skalaren UDFs, die ich je gehört habe, und ich habe viel gehört.