Ya, adalah mungkin untuk mengidentifikasi kode yang sedang berjalan, dengan menggunakan fungsi sistem @@ procid , dan OBJECT_NAME (@@ PROCID) yang lebih baik untuk memiliki nama lengkap.
Definisi: "Mengembalikan objek pengidentifikasi (ID) dari modul Transact-SQL saat ini. Modul Transact-SQL dapat berupa prosedur tersimpan, fungsi yang ditentukan pengguna, atau pemicu. @@ PROCID tidak dapat ditentukan dalam modul CLR atau modul memproses penyedia akses data. "
Anda dapat membacanya di sini .
Opsi lain adalah memeriksa paket sql dari spid saat ini dan menyimpan info itu di tabel logging. Kueri sampel yang akan digunakan dalam setiap prosedur untuk menyimpan data audit adalah:
select sp.hostname, sp.program_name, sp.loginame,
st.text as query_text
from sysprocesses sp
cross apply sys.dm_exec_sql_text(sp.sql_handle) as st
where sp.spid = @@spid
Mungkin ada terlalu banyak detail di sana..tapi saya percaya Anda mendapatkan idenya.
Opsi ketiga adalah menggunakan informasi context_info untuk sesi SP saat ini. Dan kaitkan suatu tempat informasi konteks disimpan di sana dengan setiap prosedur. Misalnya dalam procedure1 Anda menulis 111 ke konteks, di procedure2 Anda menulis 222 .. dan seterusnya
Lebih banyak info mengenai context_info yang dapat Anda baca dalam pertanyaan SO ini .
OBJECT_NAME(@@PROCID)
mengembalikan nama pemicu, bukan proc panggilan.Saya ingin melakukan ini juga. Terima kasih atas jawabannya. Karena saya masih di sini, saya akan memposting tes saya untuk menghemat waktu orang lain :)
sumber
XEvents menyediakan cara lain untuk mengenal tumpukan T-SQL meskipun SQL Server 2008 mungkin tidak mendukung jenis peristiwa yang digunakan. Solusi terdiri dari pemicu, kesalahan, dan sesi XEvent. Saya mengambil contoh Jim Brown untuk menunjukkan cara kerjanya.
Pertama-tama, saya menguji solusi untuk SQL Server 2016 SP2CU2 Dev Edition. SQL Server 2008 mendukung beberapa EXevent, tapi saya tidak punya contoh sehingga saya tidak bisa mengujinya.
Idenya adalah untuk menghasilkan kesalahan pengguna di blok try-catch dummy, kemudian menangkap kesalahan di dalam sesi XEvent dengan
tsql_stack
tindakan.SQLSERVER.error_reported
Tipe XEvent dapat menangkap semua kesalahan meskipun blok try-catch menjebaknya. Pada akhirnya,sys.dm_exec_sql_text
ekstrak kueri T-SQL dari kueri menanganitsql_stack
tindakan yang diberikan.Contoh dari jawaban Jim Brown, yang saya kembangkan, ditunjukkan di bawah ini. Pemicu memunculkan kesalahan dengan teks 'tangkap aku'. Sesi XEvent menangkap kesalahan hanya dengan teks seperti 'tangkap saya'.
Sekarang, jika Anda meluncurkan sesi XEvent (SSMS, Object Explorer, Manajemen, Acara yang Diperpanjang, Sesi, catch_insertion_into_Test), jalankan usp_RootProcIDTest dan lihat buffer cincin sesi XEvent, Anda akan melihat XML yang terdiri dari node
<action name="tsql_stack" package="sqlserver">
. Ada urutan frame node. Masukkan nilaihandle
atribut 's ke fungsi sistem' sys.dm_exec_sql_text ', dan voilà:XEvent membiarkan Anda melakukan lebih dari ini! Jangan lewatkan kesempatan untuk mempelajarinya!
sumber