2009-10-22 95 views
4

我有一個表有一個觸發器與它關聯,用於更新,插入和刪除。觸發器正常工作並執行。這裏是我的觸發代碼:通過表觸發器捕獲存儲過程參數

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 
+1

我很好奇,爲什麼知道什麼sp參數是您的審計表的目的?我們通常只關心舊的價值觀,而不是改變它們的代碼。我可以看到哪裏可以很好地捕獲運行的進程,但參數真的很重要嗎? – HLGEM 2009-10-22 17:15:38

+0

這是一個好點...我想我只是過於特別。我可以按原樣插入和刪除數據,所以這可能足夠好。 – hacker 2009-10-22 18:36:51

+0

這不是一個真正的問題,我們希望知道這個答案,或者讓它返回整個陳述的價值。我有一個超級審計系統,我只需要從proc名稱和舊/新字段值中得到我需要的內容,但我仍然想知道爲什麼會這樣。所以,請任何人有洞察力給出一個正確的答案!謝謝 – KacireeSoftware 2013-07-03 21:15:00

回答

0

我最終修改的觸發也包括像這樣的插入/刪除的數據:

declare @insData varchar(max) 
set @insData = (select * from inserted for xml auto) 
declare @delData varchar(max) 
set @delData = (select * from deleted for xml auto) 

然後插入@insData和@delData到審計表。現在顯示已更改的內容。

0

該正在執行不帶參數的存儲過程。分號表示sql語句的結尾。

sp_TestInsert 1

我認爲這是你在找什麼

sp_TestInsert 1

這是假設「sp_TestInsert 1」爲您從您的代碼傳遞什麼到SQL Server 。

+0

這就是EventInfo提供數據的方式。如果我打開這個存儲過程的分析器,當它從.NET執行時,我看到: exec sp_TestInsert @ val1 ='paramdata 1',@ val2 ='paramdata 2' 但是,審計表仍然顯示 sp_TestInsert; 1 對於SQLCommand對象,我將CommandText設置爲「sp_TestInsert」,然後添加Parameters(cmd.Parameters.AddWithValue)。不知道這是否重要..... – hacker 2009-10-22 16:32:19

+0

你將命令類型設置爲? – kemiller2002 2009-10-22 16:37:08

+0

我知道這是舊的,但我遇到了同樣的問題,我想知道爲什麼DBCC INPUTBUFFER沒有返回運行的SQL語句。我在SQL 2012企業版上。無論如何,這個答案是不正確的 – KacireeSoftware 2013-07-03 21:12:01