데이터베이스에 대한 모든 실행 작업을 감사하는 데이터베이스 감사 사양이있는 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의 가장 큰 부작용 중 하나이며, 많이 들었습니다.