SQL Server Audit Data에서 Scalar Valued User-Defined 함수 사용을 필터링하는 방법은 무엇입니까?


12

데이터베이스에 대한 모든 실행 작업을 감사하는 데이터베이스 감사 사양이있는 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_idWHERE절,하지만이 문제에 접근하는 가장 좋은 방법에 대한 우리의 현재 생각입니다. 우리가 고려해야 할 다른 접근법이 있습니까?

우리는 스칼라 함수가 재귀 CTE에서 사용될 때 쿼리가 결과 집합의 모든 행에 대한 감사 로그에 기록하는 것을 알았습니다.

대체 데이터베이스를 삭제하거나 이동할 수없는 공급 업체가 제공하는 일부 스칼라 값 함수가 있습니다.


6
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의 가장 큰 부작용 중 하나이며, 많이 들었습니다.
Erik Darling

3
별도의 데이터베이스 (감사되지 않은)에서 감사하지 않을 UDF를 작성하고 3-part-name을 통해 호출하는 옵션이 있습니까?
Scott Hodgin

@ ScottHodgin, 나는 해결책을 좋아하지만, 우리의 상황에서는 우리가 대체 데이터베이스로 삭제하거나 이동할 수없는 공급 업체가 제공하는 Scalar Valued Functions가 있습니다.
Mark Iannucci

다음에 나오는 사람들은 쿼리가 결과 집합의 모든 행에 대해 감사 로그에 기록하는 원인을 궁금해 할 것입니다. 우리는 스칼라 함수가 재귀 CTE에서 사용될 때 발생하는 것을 알았습니다.
Mark Iannucci

답변:


6

내가 일할 수 있었던 몇 가지 옵션이 있습니다. 모든 옵션은 다양한 필터 술어를 처리합니다. 참고 : 당신이해야 하지 않도록 변경을하기 위해 서버 감사를 한 다음 다시 활성화 를.

첫째, 가장 일반적인 방법은 모든 Scalar UDF를 필터링하는 것입니다. class_type감사 필드 를 사용하여이를 수행 할 수 있습니다 . 설명서에서이 필드는 VARCHAR(2)이지만 문자열을 지정할 수는 없습니다. 그러나 나는 다음을 작동시켰다.

ALTER SERVER AUDIT [servAudit]
WHERE ([class_type] <> 20038); -- EXECUTE Scalar UDF

(이 조사에 대한 자세한 정보는 여기 : Server Audit Mystery : 필터링 class_type이 오류 메시지 25713을 얻음 )

다음으로 가장 일반적인 접근 방식은 이것이 공급 업체 제공 데이터베이스이므로 변경을 수행 할 수 없기 때문에 옵션이 아닙니다. 마지막으로 다루겠습니다.

가장 일반적인 접근 방식 (그러나 확실히 작동하는 방법)은 특정 함수 이름을 필터링하는 것입니다.

ALTER SERVER AUDIT [servAudit]
WHERE ([object_name]<>'function_name');

또는 여러 이름이있는 경우 :

ALTER SERVER AUDIT [servAudit]
WHERE ([object_name]<>'function_name1' AND [object_name]<>'function_name2');

일반적이지 않지만이 방법은 필터링 할 함수의 수가 상당히 적어야하고 새로운 함수가 도입되는 경우가 많지 않기 때문에이 방법이 적합해야합니다.

마지막으로, 이러한 상황에 직면하고 변경을 제한하지 않는 다른 사람들에게는 함수를 자체 스키마에 배치 한 다음 해당 스키마 만 필터링 할 수 있습니다. 기능을 개별적으로 필터링하는 것보다 더 일반적입니다. 명명 된 스키마를 작성 fn하고 함수를 배치 한다고 가정 하십시오.

ALTER SERVER AUDIT [servAudit]
WHERE ([schema_name]<>'fn');

또한 질문에 다음 두 가지 의견이 있습니다.

불행히도 SQL Server는 관계형 IN 연산자를 허용하지 않습니다 (아마도 감사 로그에 기록해야 할 때마다 쿼리하지 않기 때문에).

과:

WHERE 절에서 object_id를 하드 코딩하는 저장 프로 시저 작성을 피하고 싶습니다.

IN운영자는 문제가되지 않습니다. 사실, 그것은 지원되지 않지만 OR조건 목록의 약어입니다 . 실제 문제는 T-SQL의 사용입니다. 문자열 또는 숫자와 같은 리터럴 만 허용됩니다. 따라서 저장 프로 시저를 실행할 수 없었을 것입니다. 내장 기능을 사용할 수도 없습니다.


이 답변에 감사드립니다. 현재이 변경 사항을 구현하는 중이며 환경에서 작동하는지 확인하면이 답변을 수락하겠습니다.
Mark Iannucci

1
@MarkIannucci 감사합니다! 또한 나는 이상적인 제안에서 사소한 버그를 수정했습니다. ANYTHING BUT 함수 대신 함수를 필터링하는 테스트에서 복사하여 붙여 넣었습니다. 나는 변경 =<>내 대답에. 나는 또한 그것을 테스트하고 그것은 광고대로 작동합니다 :-)
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.