Захват параметров хранимой процедуры с помощью триггера таблицы - PullRequest
4 голосов
/ 22 октября 2009

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

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'

Но, если я запускаю процедуру из моего приложения .NET с использованием объекта SQLCommand, поле TSQL не показывает параметры:

sp_TestInsert;1

Если я открою профилировщик для этой хранимой процедуры, когда она выполняется из .NET, это то, что я вижу:

exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2' 

Тем не менее, таблица аудита по-прежнему показывает

sp_TestInsert;1

Есть ли способ получить параметры, переданные с помощью хранимой процедуры?

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2009

Я закончил тем, что изменил триггер, чтобы также включить вставленные / удаленные данные, например:

 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 голосов
/ 22 октября 2009

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

sp_TestInsert; 1

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

sp_TestInsert 1

Это предполагает, что "sp_TestInsert; 1" это то, что выпереходят от вашего кода к серверу sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...