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 EXECUTE
tuyê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 WHERE
mệ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_id
trong WHERE
mệ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ế.
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.