2009-10-22 3 views
4

У меня есть таблица с триггером, связанная с ней для обновления, вставки и удаления. Триггер работает отлично и исполняет. Вот код для моего триггера:Захват параметров хранимой процедуры через триггер таблицы

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 
+1

Мне любопытно, почему цель состоит в том, чтобы узнать, какие параметры sp были для вашей таблицы аудита? Обычно мы только заботимся о том, что старое значение порождает новое значение для аудита, а не код, который их изменил. Я могу видеть, где было бы неплохо зафиксировать, какой был прогон, но важны ли параметры? – HLGEM

+0

Это хороший момент ... Наверное, я просто чересчур особенный. Я могу получить вставку и удалить данные как есть, так что, вероятно, это достаточно хорошо. – hacker

+0

На самом деле это не вопрос того, почему мы хотим знать ответ на этот вопрос, или то, что будет стоить за то, что оно вернет весь оператор. У меня есть система супер-аудита, и я получаю только то, что мне нужно, от имени proc и старого/нового значения поля, но я все еще хочу знать, почему это так. Поэтому ПОЖАЛУЙСТА, если у кого-то есть проницательность, дайте правильный ответ!Спасибо – KacireeSoftware

ответ

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 в таблицу аудита. Теперь это показывает, что было изменено.

0

Выполнение хранимой процедуры без параметров. Полу-двоеточие обозначает конец заявления в sql.

sp_TestInsert; 1

Я думаю, что это то, что вы ищете

sp_TestInsert 1

Это при условии, что "sp_TestInsert; 1" является то, что вы передаете из кода в SQL SERVER ,

+0

Вот как данные предоставлены EventInfo. Если я открою профайлер для этой хранимой процедуры, когда он выполняется из .NET, это то, что я вижу: exec sp_TestInsert @ val1 = 'paramdata 1', @ val2 = 'paramdata 2' Тем не менее, таблица аудита все еще сохраняется показывает sp_TestInsert; 1 Для объекта SQLCommand я устанавливаю CommandText в «sp_TestInsert», а затем добавляю параметры (cmd.Parameters.AddWithValue). Не уверен, что это важно ..... – hacker

+0

Что вы задаете для типа команды? – kemiller2002

+0

Я знаю, что это SOO старый, но я столкнулся с той же проблемой, и я хочу знать, почему DBCC INPUTBUFFER не возвращает выполняемый SQL-запрос. Я на SQL 2012 Enterprise. В любом случае, этот ответ неверен – KacireeSoftware

Смежные вопросы