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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top