我有一個表有一個觸發器與它關聯,用於更新,插入和刪除。觸發器正常工作並執行。這裏是我的觸發代碼:通過表觸發器捕獲存儲過程參數
CREATE trigger [dbo].[trg_audit_TableName]
ON [dbo].viewLayers
FOR INSERT, UPDATE, DELETE
AS
SET NOCOUNT ON
declare @inputbuffer table (EventType nvarchar(30),Parameters int,EventInfo nvarchar(4000))
insert into @inputbuffer exec('dbcc inputbuffer('[email protected]@Spid+')')
declare @ins int
declare @del int
select @ins = count(*) from inserted
select @del = count(*) from deleted
insert into audit_TableName (eventtime, CurrentMachine, appName, CurrentUser, eventtype, tsql)
select getdate(), host_name(), APP_NAME(), suser_sname(),
case
when isnull(@ins, 0) > 0 and isnull(@del, 0) > 0 then 'update'
when isnull(@ins, 0) > 0 and isnull(@del, 0) = 0 then 'insert'
else 'delete'
end,
EventInfo
from @inputbuffer
現在,如果我從Management Studio中運行一個存儲過程,插入到表中的TSWL數據是這樣的:
sp_TestInsert 'paramdata 1', 'paramdata 2'
但是,如果我從運行使用SqlCommand對象我的.NET appliation的過程中,TSQL場不顯示的參數:
sp_TestInsert;1
如果當它從執行我打開了此存儲過程分析器.NET這是我所看到的:
exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2'
然而,審計表仍顯示
sp_TestInsert;1
有沒有辦法,我可以檢索與存儲過程傳遞的參數的方法嗎?
編輯: 根據不同的存儲過程,它會插入/更新/在具有觸發
編輯2刪除表中的數據: 這裏是.NET的一個非常簡單的例子執行(「參數conn」是我SQLConnection對象):
Using cmd As SqlCommand = conn.CreateCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_TestInsert"
cmd.Parameters.AddWithValue("@val1", "paramdata 1")
cmd.Parameters.AddWithValue("@val2", "paramdata 2")
cmd.ExecuteNonQuery()
End Using
我很好奇,爲什麼知道什麼sp參數是您的審計表的目的?我們通常只關心舊的價值觀,而不是改變它們的代碼。我可以看到哪裏可以很好地捕獲運行的進程,但參數真的很重要嗎? – HLGEM 2009-10-22 17:15:38
這是一個好點...我想我只是過於特別。我可以按原樣插入和刪除數據,所以這可能足夠好。 – hacker 2009-10-22 18:36:51
這不是一個真正的問題,我們希望知道這個答案,或者讓它返回整個陳述的價值。我有一個超級審計系統,我只需要從proc名稱和舊/新字段值中得到我需要的內容,但我仍然想知道爲什麼會這樣。所以,請任何人有洞察力給出一個正確的答案!謝謝 – KacireeSoftware 2013-07-03 21:15:00