none
Insert-, Update, Delete-Trigger RRS feed

  • 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  TABELLENNAME

    REFERENCING  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

    Freitag, 25. Mai 2012 16:03

Antworten

  • Hi,

    bei CLR Triggern kann man das über die TriggerAction feststellen. Siehe:

      http://msdn.microsoft.com/de-de/library/microsoft.sqlserver.server.sqltriggercontext.triggeraction.aspx

    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 -> Delete

    Da 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

    Freitag, 25. Mai 2012 16:16
    Moderator
  • 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


    Freitag, 25. Mai 2012 16:24
  • @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

    Freitag, 25. Mai 2012 17:02

Alle Antworten

  • Hi,

    bei CLR Triggern kann man das über die TriggerAction feststellen. Siehe:

      http://msdn.microsoft.com/de-de/library/microsoft.sqlserver.server.sqltriggercontext.triggeraction.aspx

    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 -> Delete

    Da 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

    Freitag, 25. Mai 2012 16:16
    Moderator
  • 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


    Freitag, 25. Mai 2012 16:24
  • @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

    Freitag, 25. Mai 2012 17:02
  • 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

    Freitag, 25. Mai 2012 17:12
  • @Olaf

    ich bitte um Entschuldigung, dass ich nicht den richtigen Button erwischt habe.

    Mea culpa. Erare humanum est. Oder frei nach Goethe"Es irrt der Mensch, solang er.....


    A_SqlDeveloper

    Freitag, 25. Mai 2012 18:20