Sql-Server-2008

是否可以在觸發器中獲取執行呼叫堆棧?

  • August 11, 2019

我有 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 的更多資訊。

引用自:https://dba.stackexchange.com/questions/3815