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)
我最终修改了触发器以包含插入/删除的数据,如下所示:
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插入审计表中。现在显示了更改的内容。