Làm cách nào để lọc sử dụng Hàm vô hướng có giá trị do người dùng xác định từ dữ liệu kiểm toán SQL Server?


12

Chúng tôi có cơ sở dữ liệu SQL Server có đặc tả kiểm toán cơ sở dữ liệu để kiểm tra tất cả các hành động thực thi trên cơ sở dữ liệu.

CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])

Chúng tôi đã phát hiện ra rằng một số truy vấn sẽ ghi vào nhật ký kiểm toán việc sử dụng hàm vô hướng cho mỗi hàng trong tập kết quả. Khi điều này xảy ra, nhật ký sẽ lấp đầy trước khi chúng ta có thể đưa nó vào nơi an nghỉ cuối cùng và chúng ta có một khoảng trống trong việc đăng nhập.

Thật không may vì lý do tuân thủ, chúng tôi không thể ngừng kiểm tra mọi EXECUTEtuyên bố.

Suy nghĩ đầu tiên của chúng tôi về cách tiếp cận vấn đề này là sử dụng WHEREmệnh đề trên Kiểm toán máy chủ để lọc ra hoạt động. Mã trông như thế này:

WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )

Thật không may, SQL Server không cho phép toán tử IN quan hệ (có thể vì nó không muốn truy vấn mỗi lần nó phải ghi vào nhật ký kiểm toán).

Chúng tôi muốn tránh việc viết một lưu trữ được mã hóa cứng object_idtrong WHEREmệnh đề, nhưng đó là suy nghĩ hiện tại của chúng tôi về cách tốt nhất để tiếp cận vấn đề này. Có một cách tiếp cận khác mà chúng ta nên xem xét?

Chúng tôi đã nhận thấy rằng khi hàm vô hướng được sử dụng trong CTE đệ quy, thì nó sẽ khiến truy vấn ghi vào nhật ký kiểm toán cho mỗi hàng trong tập kết quả.

Có một số Hàm có giá trị vô hướng được cung cấp bởi nhà cung cấp mà chúng tôi không thể xóa hoặc chuyển sang cơ sở dữ liệu thay thế.


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.- Đó là một trong những tác dụng phụ tuyệt vời nhất của UDF vô hướng mà tôi từng nghe và tôi đã nghe rất nhiều.
Erik Darling

3
Có tùy chọn tạo UDF nào mà bạn không muốn kiểm toán trong một cơ sở dữ liệu riêng biệt (không được kiểm toán) và gọi chúng thông qua tên 3 phần?
Scott Hodgin

@ScottHodgin, tôi thích cách giải quyết, nhưng trong trường hợp của chúng tôi, có một số Hàm có giá trị vô hướng được cung cấp bởi một nhà cung cấp mà chúng tôi không thể xóa hoặc chuyển sang cơ sở dữ liệu thay thế.
Mark Iannucci

Những người theo sau có thể tự hỏi trường hợp nào khiến truy vấn ghi vào nhật ký kiểm toán cho mỗi hàng trong tập kết quả; chúng tôi nhận thấy nó xảy ra khi hàm vô hướng được sử dụng trong CTE đệ quy.
Mark Iannucci

Câu trả lời:


6

Có một vài lựa chọn mà tôi đã có thể làm việc. Tất cả các tùy chọn xử lý các biến thể của vị từ bộ lọc. LƯU Ý: bạn phải vô hiệu hóa Kiểm toán máy chủ để thực hiện các thay đổi và sau đó kích hoạt lại nó.

Đầu tiên, cách tiếp cận chung nhất là lọc ra tất cả các UDF vô hướng. Bạn có thể làm điều đó bằng cách sử dụng class_typelĩnh vực kiểm toán. Tài liệu chỉ ra rằng trường này là VARCHAR(2), nhưng nó không cho phép chỉ định một chuỗi. Tuy nhiên, tôi đã làm như sau để làm việc:

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

(thông tin thêm về cuộc điều tra tại đây: Bí ẩn Kiểm toán Máy chủ: Lọc class_type bị Lỗi Msg 25713 )

Cách tiếp cận chung nhất tiếp theo không phải là một lựa chọn vì đã nói rằng đây là cơ sở dữ liệu do nhà cung cấp cung cấp và do đó không có thay đổi nào có thể được thực hiện. Vì vậy, tôi sẽ bao gồm điều đó cuối cùng.

Cách tiếp cận chung chung nhất (nhưng một cách chắc chắn hoạt động) là lọc ra tên hàm cụ thể:

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

Hoặc, nếu nhiều tên:

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

Mặc dù không chung chung, cách tiếp cận này sẽ ổn vì số lượng hàm cần lọc khá nhỏ và sẽ không thường xuyên được giới thiệu các hàm mới.

Cuối cùng, đối với những người khác phải đối mặt với tình huống này và không bị hạn chế thực hiện các thay đổi: bạn có thể đặt các chức năng vào Schema của riêng họ và sau đó lọc ra Schema đó. Điều này là chung chung hơn là lọc ra các chức năng riêng lẻ. Giả sử rằng bạn tạo một Lược đồ có tên fnvà đặt (các) hàm vào đó:

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

CSONG, liên quan đến hai ý kiến ​​sau trong câu hỏi:

Thật không may, SQL Server không cho phép toán tử IN quan hệ (có thể vì nó không muốn truy vấn mỗi lần nó phải ghi vào nhật ký kiểm toán).

và:

Chúng tôi muốn tránh việc viết một Proc được lưu trữ, mã hóa cứng object_id trong mệnh đề WHERE

Các INnhà điều hành không phải là vấn đề. Đúng, nó không được hỗ trợ, nhưng nó chỉ là viết tắt cho một danh sách các ORđiều kiện. Vấn đề thực tế là việc sử dụng T-SQL. Chỉ có chữ - chuỗi hoặc số - được cho phép. Vì vậy, dù sao bạn cũng không thể thực hiện Quy trình được lưu trữ. Bạn cũng không thể sử dụng các chức năng tích hợp.


cảm ơn bạn đã phản hồi Chúng tôi đang trong quá trình thực hiện thay đổi này và tôi sẽ chấp nhận câu trả lời này khi chúng tôi xác nhận nó hoạt động trong môi trường của chúng tôi.
Mark Iannucci

1
@MarkIannucci Cảm ơn! Ngoài ra, tôi chỉ sửa một lỗi nhỏ trong đề xuất lý tưởng của mình. Tôi đã sao chép và dán từ kiểm tra nơi tôi đang lọc các hàm FOR thay vì BẤT CỨ chức năng nào. Tôi đã thay đổi =để được <>trong câu trả lời của tôi. Tôi cũng vừa thử nó và nó hoạt động như quảng cáo :-)
Solomon Rutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.