通过表触发捕获存储过程参数

时间:2009-10-22 16:23:14

标签: sql sql-server stored-procedures parameters triggers

我有一个表,它有一个与之关联的触发器,用于更新,插入和删除。触发器工作正常并执行。这是我的触发器的代码:

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('+@@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应用程序运行该过程,则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

2 个答案:

答案 0 :(得分:0)

这是在没有参数的情况下执行存储过程。分号表示sql中语句的结束。

sp_TestInsert; 1

我认为这就是你要找的东西

sp_TestInsert 1

这假设“sp_TestInsert; 1”是您从代码传递到sql server的内容。

答案 1 :(得分: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插入到审计表中。这现在显示了改变了什么。