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

hac*_*ker 5 sql sql-server parameters triggers stored-procedures

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

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
Run Code Online (Sandbox Code Playgroud)

现在,如果我从 Management Studio 运行存储过程,插入表中的 TSWL 数据如下所示:

sp_TestInsert 'paramdata 1', 'paramdata 2'
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 SQLCommand 对象从 .NET 应用程序运行该过程,TSQL 字段不会显示参数:

sp_TestInsert;1
Run Code Online (Sandbox Code Playgroud)

如果我在从 .NET 执行该存储过程时打开该存储过程的探查器,我会看到以下内容:

exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2' 
Run Code Online (Sandbox Code Playgroud)

然而,审计表仍然显示

sp_TestInsert;1
Run Code Online (Sandbox Code Playgroud)

有没有办法可以检索通过存储过程传递的参数?

编辑: 根据存储过程,它将在具有触发器的表中插入/更新/删除数据

编辑 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
Run Code Online (Sandbox Code Playgroud)

hac*_*ker 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)  
Run Code Online (Sandbox Code Playgroud)

然后将@insData和@delData插入审计表中。现在显示了更改的内容。