Benutzer mit den meisten Antworten
Insert-, Update, Delete-Trigger

Frage
-
Hallo zusammen,
in Oracle besteht die Möglickeit auf die DML-Aktionen zu reagieren ==> Beispiel (in PL/SQL):CREATE OR REPLACE
TRIGGER TRIGGERNAME
-- Stellt fest um welche Aktion es sich handelt und
-- schreibt die ursprünglichen Werte in die Historientabelle.
AFTER DELETE OR INSERT OR UPDATE
ON TABELLENNAMEREFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
DECLARE
V_USER NVARCHAR2(200) := NULL;
V_AKTION varchar2(20);
BEGIN
If (DELETING) THEN
V_AKTION :='DELETE';
ELSIF (UPDATING) THEN
V_AKTION :='UPDATE';
ELSIF (INSERTING) THEN
V_AKTION :='INSERT';
END IF;
SELECT UPPER(osuser) INTO V_USER FROM v$session WHERE audsid=USERENV('sessionid');
BEGIN
INSERT INTO TABELLENNAME .....Auf den fett dargestellten Ausschnitt habe ich es in SQL Server abgesehen. Stellt SQL-Server eine Funktion / Prozedur zur Verfügung, in der die Ereignisse abfangen kann?
Für Anregungen bin ich mehr als dankbar.
A_SqlDeveloper
Antworten
-
Hi,
bei CLR Triggern kann man das über die TriggerAction feststellen. Siehe:
Bei "normalen" Triggern in T-SQL verwende ich die inserted und deleted Tabellen, die im Trigger zur Verfügung stehen.
Wenn "inserted" gefüllt, "deleted" leer -> Insert
Wenn "inserted" gefüllt, "deleted" gefüllt -> Update
Wenn "inserted" leer, "deleted" gefüllt -> DeleteDa ich seit einiger Zeit für Audittrails nur mehr mit CLR Triggern arbeite, weiß ich nicht, ob es in den neueren SQL Server Versionen in T-SQL Triggern eine andere Möglichkeit gibt, die Aktion herauszufinden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Olaf HelperMVP Freitag, 25. Mai 2012 17:04
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 18:10
-
Hallo,
auch mir wäre kein Flag bekannt, der die Aktion zurück gibt.
Hier mal ein Beispiel zu der Grundidee von Stefan bzgl. inserted/deleted:
CREATE TABLE dbo.TestTable (ID int); GO CREATE TRIGGER dbo.TRG_TestTable_IUD ON dbo.TestTable FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted) PRINT 'Insert'; IF EXISTS(SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted) PRINT 'Update'; IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted) PRINT 'Delete'; END; GO INSERT INTO dbo.TestTable VALUES(1); UPDATE dbo.TestTable SET ID = 2; DELETE FROM dbo.TestTable; GO
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Bearbeitet Olaf HelperMVP Freitag, 25. Mai 2012 16:26
- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 25. Mai 2012 17:57
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 18:10
-
@Stefan und Olaf,
danke für die Info. Ich gehe mal davon aus, dass das gesuchte Flag in SQL-Server nicht vorhanden ist. Sowerde ich mal den von Olaf skizierten Weg weiter verfolgen.
Grüße
A_SqlDeveloper
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 17:03
Alle Antworten
-
Hi,
bei CLR Triggern kann man das über die TriggerAction feststellen. Siehe:
Bei "normalen" Triggern in T-SQL verwende ich die inserted und deleted Tabellen, die im Trigger zur Verfügung stehen.
Wenn "inserted" gefüllt, "deleted" leer -> Insert
Wenn "inserted" gefüllt, "deleted" gefüllt -> Update
Wenn "inserted" leer, "deleted" gefüllt -> DeleteDa ich seit einiger Zeit für Audittrails nur mehr mit CLR Triggern arbeite, weiß ich nicht, ob es in den neueren SQL Server Versionen in T-SQL Triggern eine andere Möglichkeit gibt, die Aktion herauszufinden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Olaf HelperMVP Freitag, 25. Mai 2012 17:04
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 18:10
-
Hallo,
auch mir wäre kein Flag bekannt, der die Aktion zurück gibt.
Hier mal ein Beispiel zu der Grundidee von Stefan bzgl. inserted/deleted:
CREATE TABLE dbo.TestTable (ID int); GO CREATE TRIGGER dbo.TRG_TestTable_IUD ON dbo.TestTable FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted) PRINT 'Insert'; IF EXISTS(SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted) PRINT 'Update'; IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted) PRINT 'Delete'; END; GO INSERT INTO dbo.TestTable VALUES(1); UPDATE dbo.TestTable SET ID = 2; DELETE FROM dbo.TestTable; GO
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Bearbeitet Olaf HelperMVP Freitag, 25. Mai 2012 16:26
- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 25. Mai 2012 17:57
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 18:10
-
@Stefan und Olaf,
danke für die Info. Ich gehe mal davon aus, dass das gesuchte Flag in SQL-Server nicht vorhanden ist. Sowerde ich mal den von Olaf skizierten Weg weiter verfolgen.
Grüße
A_SqlDeveloper
- Als Antwort markiert A_SQLDeveloper Freitag, 25. Mai 2012 17:03
-
So ganz hast Du das Foren-Prinzip noch nicht verstanden; lies Dir doch bitte einmal die Foren-Regeln => Lösungsbeiträge durch.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing