Thay đổi dữ liệu chụp - làm thế nào để biết ai đã thực hiện thay đổi?


10

Theo dõi ai đã thực hiện thay đổi được xác định bởi CDC.

Dọc theo dòng hack datetime của tôi, tôi đã thử cách tiếp cận tương tự bằng cách thêm suser_sname làm trường mới với giá trị mặc định trên bảng theo dõi thay đổi cdc. Nhưng, điều đó dường như trả lại chủ sở hữu của quy trình cdc chứ không phải người dùng đã thực hiện thay đổi trên bảng cơ sở. Tôi cũng đã thử bản gốc_login nhưng nó trả về đăng nhập tài khoản dịch vụ sql. Một lần nữa, có khả năng liên quan đến quá trình cdc và không phải người dùng đã bắt đầu thay đổi.

Tôi đã tìm thấy một câu hỏi tương tự về tràn chồng nhưng không có câu trả lời nào ngoài việc theo dõi các thay đổi từ giao diện người dùng hoặc thông qua trình kích hoạt, dường như đánh bại mục đích sử dụng cdc. Tôi sẽ không đăng lại nhưng vì bản gốc đã có trên stackoverflow nên tôi nghĩ tôi sẽ dùng thử ở đây đặc biệt là nếu R2 hoặc 2012 đã giới thiệu một cách tốt hơn.

Vì vậy, tóm lại: Làm thế nào để tôi biết ai đã thực hiện thay đổi trong việc thu thập dữ liệu thay đổi?

Câu trả lời:


7

Tôi đã gửi một lỗi về điều này, nhưng nó đã bị đóng là "theo thiết kế."

http://connect.microsoft.com/QueryServer/feedback/details/283707/cdc-options-to-capture-more-data-username-date-time-etc

Thật không may, bạn sẽ phải sử dụng một kỹ thuật khác (ví dụ: Kiểm toán SQL hoặc trình kích hoạt) để có được thông tin này (và một số mã tùy chỉnh để cố tương quan nó với dữ liệu CDC nhiều nhất có thể). Tôi cũng đã viết về sự thiếu sót này trong chương "Kiểm toán máy chủ SQL, theo dõi thay đổi và thu thập dữ liệu thay đổi" trong cuốn sách SQL Server MVP Deep Dives (tập 1).

Tôi xin lỗi vì tôi không có cách giải quyết tốt hơn cho bạn nhưng khả năng tích hợp sẵn của CDC sẽ không đáp ứng yêu cầu của bạn. :-(


@RThomas bạn vẫn có thể bình chọn cho các mặt hàng ngay cả khi chúng bị đóng - thỉnh thoảng chúng vẫn được xem lại. Thậm chí hữu ích hơn so với bỏ phiếu là thêm một nhận xét nêu chi tiết về nhu cầu kinh doanh sẽ làm cho thông tin này hữu ích, bao gồm cả chi phí tái cấu trúc mọi thứ để giải quyết các chức năng còn thiếu. Tôi đã viết lên một chút về cách dữ liệu định tính có thể vượt trội hơn dữ liệu định lượng ...
Aaron Bertrand

Điều tốt để biết, tôi nghĩ đóng cửa có nghĩa là đóng cửa để bỏ phiếu là tốt. Tôi đã chỉ ra trong nhận xét của mình rằng Oracle cung cấp điều này trong quá trình thực hiện CDC của họ. Nó có vẻ hợp lý. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/...
RThomas

6

Bạn có thể thêm cột và có một kích hoạt trên bảng để điền người dùng vào insert / update / xóa và cdc sau đó sẽ lưu trữ này. Bạn có thể lấy tên người dùng từ UI bằng cách chuyển tên người dùng bằng thông tin ngữ cảnh hoặc từ phiên thực tế

SET @CapturedBy = CAST(REPLACE(CAST(CONTEXT_INFO() AS VARCHAR(10)),CHAR(0),'''''''') AS INT)

IF(@CapturedBy) IS NULL
    BEGIN
       SELECT @CapturedBy = P.[Code]
       FROM sys.dm_exec_sessions AS S
         INNER JOIN [dbo].[Person] AS P
          ON S.[login_name] = P.[User_Name]
       WHERE S.[session_id] = @@spid
    END

0

Bạn có thể thêm trường UpdateBy trên bảng chính, đặt nó thành mặc định thành SUSER_NAME () hoặc ORIGINAL_LOGIN () và dữ liệu đó được CDC điền vào không? Tôi tin rằng sẽ cung cấp cho bạn cùng thông tin bạn đang tìm kiếm.


Điều đó chỉ mang lại cho bạn tài khoản svc / chủ sở hữu của cdc, bạn có thể lưu ý rằng tôi đã thử những điều đó và ghi lại kết quả theo cách câu hỏi ban đầu của tôi vào tháng 2
RThomas

Nhận xét của bạn cho biết bạn đã thêm nó vào bảng ChangeData. Tôi đang nói về bảng gốc, bảng ChangeData dựa trên. Tuy nhiên tôi nhận ra sau khi tôi đăng bài này sẽ chỉ hoạt động cho các phần chèn
Đầu bếp

Ahhhh, đã không bắt được điều đó. Tôi hiểu những gì bạn nói bây giờ.
RThomas
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.