У меня есть таблица с триггером, связанная с ней для обновления, вставки и удаления. Триггер работает отлично и исполняет. Вот код для моего триггера:Захват параметров хранимой процедуры через триггер таблицы
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'
Но, если я запустить процедуру из моего .NET appliation с использованием объекта SqlCommand, поле TSQL не показывает параметры:
sp_TestInsert;1
Если я открываю профилировщика для этой хранимой процедуры, которая выполняется из .NET это то, что я вижу:
exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2'
Тем не менее, таблица аудита все еще показывает
sp_TestInsert;1
Есть ли способ, что я могу получить параметры, передаваемые с помощью хранимой процедуры?
EDIT: В зависимости от хранимой процедуры, она будет вставлять/обновлять/удалять данные в таблице, которая имеет триггер
EDIT 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
Мне любопытно, почему цель состоит в том, чтобы узнать, какие параметры sp были для вашей таблицы аудита? Обычно мы только заботимся о том, что старое значение порождает новое значение для аудита, а не код, который их изменил. Я могу видеть, где было бы неплохо зафиксировать, какой был прогон, но важны ли параметры? – HLGEM
Это хороший момент ... Наверное, я просто чересчур особенный. Я могу получить вставку и удалить данные как есть, так что, вероятно, это достаточно хорошо. – hacker
На самом деле это не вопрос того, почему мы хотим знать ответ на этот вопрос, или то, что будет стоить за то, что оно вернет весь оператор. У меня есть система супер-аудита, и я получаю только то, что мне нужно, от имени proc и старого/нового значения поля, но я все еще хочу знать, почему это так. Поэтому ПОЖАЛУЙСТА, если у кого-то есть проницательность, дайте правильный ответ!Спасибо – KacireeSoftware