Erfassen von Stored Procedure Parameter über die Tabelle Auslöser
-
05-07-2019 - |
Frage
Ich habe eine Tabelle, die einen Auslöser mit ihm für Update, Insert und Delete zugeordnet ist. Der Auslöser funktioniert gut und führt. Hier ist der Code für meine Trigger:
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
Nun, wenn ich eine gespeicherte Prozedur aus dem Management Studio, die TSWL Daten in die Tabelle eingefügt laufen sieht wie folgt aus:
sp_TestInsert 'paramdata 1', 'paramdata 2'
Aber, wenn ich das Verfahren von meiner .NET appliation mit einem SQLCommand Objekt ausführen, wird das TSQL Feld der Parameter nicht zeigen:
sp_TestInsert;1
Wenn ich die Profiler für diese gespeicherte Prozedur öffnen, wenn es von .NET ausgeführt wird, ist das, was ich sehe:
exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2'
Doch die Audit-Tabelle noch zeigt
sp_TestInsert;1
Gibt es eine Möglichkeit, dass ich die Parameter mit der gespeicherten Prozedur übergeben abrufen können?
EDIT: Je nach der gespeicherten Prozedur wird es insert / update / Löschen von Daten in einer Tabelle, die den Trigger hat
EDIT 2: Hier ist ein sehr kurzes Beispiel für die .NET-Ausführung ( "Conn ist mein SQLConnection-Objekt):
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
Lösung 2
I beendet den Trigger Modifizieren bis auch die eingefügten / gelöschten Daten wie so umfassen:
declare @insData varchar(max)
set @insData = (select * from inserted for xml auto)
declare @delData varchar(max)
set @delData = (select * from deleted for xml auto)
Und dann @insData und @delData in die Audit-Tabelle eingefügt. Dies zeigt nun, was geändert wurde.
Andere Tipps
Dies führt die gespeicherte Prozedur ohne Parameter. Das Semikolon bedeutet das Ende einer Anweisung in SQL.
sp_TestInsert; 1
Ich denke, das ist das, was Sie suchen
sp_TestInsert 1
Dies wird unter der Annahme, dass „sp_TestInsert; 1“ ist, was Sie von Ihrem Code zu SQL Server übergeben.