Ubah pengambilan data - bagaimana cara mengetahui siapa yang membuat perubahan?

10

Melacak siapa yang membuat perubahan yang diidentifikasi oleh CDC.

Sejalan dengan hack datetime saya, saya mencoba pendekatan yang sama dengan menambahkan suser_sname sebagai bidang baru dengan nilai default pada tabel track perubahan cdc. Tapi, itu sepertinya mengembalikan pemilik proses cdc dan bukan pengguna yang memprakarsai perubahan di tabel dasar. Saya juga mencoba original_login tetapi itu mengembalikan login akun layanan sql. Sekali lagi, kemungkinan terkait dengan proses cdc dan bukan pengguna yang memulai perubahan.

Saya menemukan pertanyaan serupa pada stack-overflow tetapi tanpa jawaban selain melacak perubahan dari ujung depan atau melalui pemicu, yang tampaknya mengalahkan tujuan menggunakan cdc. Saya tidak akan memposting ulang tetapi karena aslinya ada di stackoverflow saya pikir saya akan mencobanya di sini terutama jika R2 atau 2012 telah memperkenalkan cara yang lebih baik.

Jadi, singkatnya: Bagaimana saya tahu siapa yang membuat perubahan dalam menangkap data?

RThomas
sumber

Jawaban:

7

Saya mengajukan bug tentang ini, tetapi ditutup sebagai "oleh desain."

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

Sayangnya Anda harus menggunakan teknik lain (misalnya SQL Audit atau pemicu) untuk mendapatkan informasi ini (dan beberapa kode khusus untuk mencoba menghubungkannya dengan data CDC sebanyak yang Anda bisa). Saya menulis tentang kekurangan ini juga dalam bab saya "SQL Server Audit, Ubah Pelacakan, dan Ubah Data Capture" dalam buku SQL Server MVP Deep Dives (volume 1).

Maaf saya tidak memiliki solusi yang lebih baik untuk Anda, tetapi kemampuan bawaan CDC tidak akan memenuhi persyaratan Anda. :-(

Aaron Bertrand
sumber
@RThomas Anda masih dapat memilih item meskipun ditutup - barang-barang itu kadang-kadang dikunjungi kembali. Yang lebih bermanfaat daripada memberi suara adalah menambahkan komentar yang menyatakan perincian kebutuhan bisnis yang akan membuat informasi ini berguna, termasuk mungkin biaya refactoring hal-hal untuk mengatasi fungsi yang hilang. Saya menulis sedikit tentang bagaimana data kualitatif dapat melebihi data kuantitatif ...
Aaron Bertrand
Senang tahu, saya pikir tertutup berarti tertutup untuk pemungutan suara juga. Saya menunjukkan dalam komentar saya bahwa Oracle menawarkan ini dalam implementasi CDC mereka. Agak logis. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Anda bisa menambahkan kolom dan memiliki pemicu di atas meja untuk mengisi pengguna saat memasukkan / memperbarui / menghapus dan cdc kemudian akan menyimpan ini. Anda dapat mengambil nama pengguna baik dari UI dengan melewati nama pengguna menggunakan info konteks atau dari sesi aktual

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
pengguna2031675
sumber
0

Bisakah Anda menambahkan bidang UpdatedBy pada tabel utama, mengaturnya ke default ke SUSER_NAME () atau ORIGINAL_LOGIN () dan memiliki data yang diisi oleh CDC? Saya percaya itu akan memberi Anda informasi yang sama yang Anda cari.

Koki
sumber
Itu hanya memberi Anda akun SVC / pemilik cdc, Anda mungkin mencatat bahwa saya mencoba hal-hal itu dan mendokumentasikan hasilnya dengan cara pertanyaan asli saya kembali pada bulan Februari
RThomas
Komentar Anda mengatakan Anda menambahkannya ke tabel ChangeData. Saya sedang berbicara tentang tabel asli tabel ChangeData didasarkan. Namun saya menyadari setelah saya memposting ini hanya akan berfungsi untuk memasukkan
Chef
Ahhhh, tidak menangkap itu. Saya mengerti apa yang Anda katakan sekarang.
RThomas