Informasi latar belakang:
- Saya membuat koleksi tabel audit untuk melacak pembaruan dan menghapus satu set tabel data untuk aplikasi saya.
- Catatan audit dibuat melalui pemicu.
- DML dalam basis data aplikasi saya umumnya akan berasal dari login yang digunakan suatu layanan untuk masuk ke dalam basis data. Karena itu, saya pikir hasil dari
SYSTEM_USER
akan selalu sama ketika dipanggil dalam sebuah pemicu. - Aplikasi saya tidak menyimpan data pengguna saat ini, meskipun string
UserId
diberikan kepadanya setiap kali DML dilakukan (dilakukan secara eksklusif dalam prosedur tersimpan).
Masalah yang saya temui adalah ketika pengguna menghapus sebuah catatan, saya ingin tahu siapa yang melakukannya. Karena akan dilakukan dengan login yang sama, saya tidak ingin melihat bahwa semua tindakan dilakukan oleh layanan, saya ingin melihat pengguna mana yang melakukannya. Ini bukan masalah pada pembaruan, karena kami memiliki ModifiedBy
kolom yang akan diperbarui melalui dikirim UserId
pada pembaruan.
Pertanyaannya adalah: Apakah ada cara untuk mengatur SYSTEM_USER
atau memasukkan informasi pengguna ke pemicu saat penghapusan dijalankan?
Ide "terbaik" yang saya miliki saat ini, meskipun saya tidak yakin apakah itu ide yang bagus, adalah bahwa dalam layanan saya memeriksa untuk melihat apakah saat UserId
ini ada dalam database sebagai pengguna, dan jika tidak membuat pengguna objek untuk mereka. Kemudian jalankan prosedur tersimpan dengan EXECUTE AS User = @UserId
. Kemudian ketika DML dilakukan dalam prosedur tersimpan dan pemicu kebakaran, SYSTEM_USER
harus mengembalikan pengguna dari EXECUTE AS
.
sumber
Jawaban:
Meskipun menggunakan
EXECUTE AS User = @UserId
mungkin merupakan pilihan terbaik Anda (tergantung pada masalah lain), berikut adalah pendekatan alternatif:Di dalam Anda menyimpan prosedur, atau kapan saja dalam sesi SQL Anda sebelum Anda
DELETE
menjalankan perintah berikut:Kemudian di Trigger Anda, Anda dapat mengambil nilai ini dengan
Ini memiliki beberapa kelemahan, yang terpenting adalah Anda tidak dapat langsung menggunakan CONTEXT_INFO untuk lebih dari satu hal sekaligus.
sumber
Bergantung pada bagaimana Anda mengubah konteks pengguna dari login individual ke login layanan, Anda mungkin menemukan bahwa ORIGINAL_LOGIN () sangat membantu.
http://technet.microsoft.com/en-us/library/ms189492.aspx
"Fungsi ini dapat berguna dalam mengaudit identitas konteks penghubung asli. Sedangkan fungsi seperti SESSION_USER dan CURRENT_USER mengembalikan konteks eksekusi saat ini, ORIGINAL_LOGIN mengembalikan identitas login yang pertama kali terhubung ke instance dari SQL Server di sesi itu."
sumber
Anda juga dapat mencoba menambahkan
Host_Name
ke tabel Anda. Saya telah menemukan dalam situasi di mana saya memiliki login bersama saya biasanya dapat melacak seseorang dengan nama mesin mereka sejak 95% dari waktu seseorang bekerja dari mesin mereka sendiri. Itu tidak selalu berhasil, tetapi bisa menjadi informasi sekunder yang bermanfaat.Sayangnya ini tidak akan berfungsi jika Anda bekerja dengan aplikasi web di mana tuan rumah akan selalu menjadi aplikasi web itu sendiri tetapi mungkin patut dicoba.
sumber