我有一个表,它有一个与之关联的触发器,用于更新,插入和删除。触发器工作正常并执行。这是我的触发器的代码:
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
答案 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插入到审计表中。这现在显示了改变了什么。