Thông tin lai lịch:
- Tôi đang tạo một tập hợp các bảng kiểm toán để theo dõi các cập nhật và xóa vào một tập hợp các bảng dữ liệu cho ứng dụng của tôi.
- Hồ sơ kiểm toán được tạo ra thông qua kích hoạt.
- DML trong cơ sở dữ liệu của ứng dụng của tôi thường sẽ đến từ thông tin đăng nhập mà dịch vụ sử dụng để truy cập vào cơ sở dữ liệu. Bởi vì điều này, tôi nghĩ rằng kết quả từ
SYSTEM_USER
sẽ luôn giống nhau khi được gọi trong một kích hoạt. - Ứng dụng của tôi hiện không lưu trữ dữ liệu người dùng, mặc dù một chuỗi
UserId
được cung cấp cho nó mỗi khi DML được thực hiện (được thực hiện riêng trong các thủ tục được lưu trữ).
Vấn đề tôi gặp phải là khi người dùng xóa một bản ghi, tôi muốn biết ai đã làm nó. Bởi vì nó sẽ được thực hiện bằng cùng một thông tin đăng nhập, tôi không muốn thấy rằng tất cả các hành động đã được thực hiện bởi dịch vụ, tôi muốn xem người dùng nào đã làm điều đó. Đây không phải là vấn đề về bản cập nhật, bởi vì chúng tôi có ModifiedBy
các cột sẽ được cập nhật thông qua việc gửi trong các UserId
bản cập nhật.
Câu hỏi là: Có cách nào để thiết lập SYSTEM_USER
hoặc lấy thông tin người dùng vào trình kích hoạt khi xóa không?
Ý tưởng "tốt nhất" tôi có ngay bây giờ, mặc dù tôi không chắc đó có phải là ý tưởng hay không, đó là trong dịch vụ tôi kiểm tra xem liệu dòng điện UserId
có trong cơ sở dữ liệu với tư cách là người dùng không và nếu không tạo người dùng đối tượng cho họ. Sau đó chạy thủ tục lưu trữ với EXECUTE AS User = @UserId
. Sau đó, khi DML được thực hiện trong thủ tục được lưu trữ và kích hoạt kích hoạt, SYSTEM_USER
sẽ trả về người dùng từ EXECUTE AS
.