Sql-Server-2008
是否可以在觸發器中獲取執行呼叫堆棧?
我有 10 個儲存過程,每個儲存過程都將插入到一個 tableX 中。
是否有可能在 tableX 的觸發器主體中獲取導致修改 tableX 的對象(儲存的 proc1 或 sp2 或….)?
謝謝你。
是的,可以通過使用@@procid 系統函式來辨識正在執行的程式碼,並且最好使用 OBJECT_NAME(@@PROCID) 來獲得完整的名稱。
定義:“返回目前 Transact-SQL 模組的對象標識符 (ID)。Transact-SQL 模組可以是儲存過程、使用者定義的函式或觸發器。不能在 CLR 模組或 in-程序數據訪問提供者。”
你可以在這裡閱讀。
另一種選擇是檢查目前 spid 的 sql 計劃並將該資訊保存在日誌表中。在每個過程中用於保存審計數據的範例查詢將是:
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
也許那裡有太多細節……但我相信你明白了。
第三種選擇是將context_info資訊用於目前 SP 的會話。並將保存在那裡的上下文資訊與每個過程相關聯。例如,在程序 1 中,您將 111 寫入上下文,在程序 2 中,您寫入 222.. 等等。
您可以在此 SO question中閱讀有關 context_info 的更多資訊。