Announcement

Collapse
No announcement yet.

referenzielle Aktionen und TSQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • referenzielle Aktionen und TSQL

    Hallo,
    mein TSQL-Buch aus dem Jahre 2002 scheint nicht mehr ganz auf dem Aktuellen Stand zu sein, da es mir sagt, dass die einzige rA die TSQL unterstützt "NO ACTION" wäre. Zu meiner positiven Überraschung konnte ich feststellen, dass auch CASCADE unterstützt wird.. könnte es sein dass auch SET DEFAULT oder SET NULL unterstütz werden und nur der Code abweichend ist.. - ich erhalte immer Fehlermeldungen -
    oder muss ich in diesen Fällen auf Trigger zurückgreifen?

  • #2
    Hallo,

    die Online-Hilfedatei ("BOL") des MS SQL Server ist sehr ergiebig - so werden alle Optionen ausführlich unter anderem auf den Hilfeseiten zu CREATE TABLE und REFERENTIAL_CONSTRAINTS beschrieben. Der MS SQL Server 2000 unterstützt nur CASCADE und NO ACTION:
    <pre>
    ...
    | [ [ FOREIGN KEY ]
    REFERENCES ref_table [ ( ref_column ) ]
    [ ON DELETE { CASCADE | NO ACTION } ]
    [ ON UPDATE { CASCADE | NO ACTION } ]
    [NOT FOR REPLICATION]
    ]
    ...
    </pre>
    Für andere Operationen müssen wir zur Zeit noch auf einen entsprechend ausgestalteten INSTEAD OF-Trigger zurückgreifen. Das folgende Beispiel demonstriert nur das Prinzip (auch wenn dieses Beispiel besser mit CASCADE umgesetzt werden könnte):
    <pre>
    USE tempdb
    GO
    CREATE TABLE TLBMASTER (
    MID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    Wert VARCHAR(15))
    GO
    CREATE TABLE TLBDETAIL (
    DID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    MID INTEGER NOT NULL,
    Detail VARCHAR(15))
    GO
    INSERT INTO TLBMASTER (Wert) VALUES ('Eintrag 1')
    INSERT INTO TLBMASTER (Wert) VALUES ('Eintrag 2')
    INSERT INTO TLBMASTER (Wert) VALUES ('Eintrag 3')
    GO
    INSERT INTO TLBDETAIL (MID,Detail) VALUES (1,'Detail 1a')
    INSERT INTO TLBDETAIL (MID,Detail) VALUES (1,'Detail 1b')
    INSERT INTO TLBDETAIL (MID,Detail) VALUES (2,'Detail 2a')
    INSERT INTO TLBDETAIL (MID,Detail) VALUES (3,'Detail 3a')
    GO
    CREATE TRIGGER trTLBMASTER ON TLBMASTER INSTEAD OF DELETE
    AS
    BEGIN
    -- Schritt 1: Zuerst die Detail-Datensätze löschen
    DELETE FROM TLBDETAIL
    WHERE MID IN (SELECT MID FROM deleted)
    -- Schritt 2: Danach den Master-Datensatz löschen
    DELETE FROM TLBMASTER
    WHERE MID IN (SELECT MID FROM deleted)
    END
    GO
    SELECT * FROM TLBMASTER
    SELECT * FROM TLBDETAIL
    GO
    DELETE FROM TLBMASTER WHERE MID = 1
    GO
    SELECT * FROM TLBMASTER
    SELECT * FROM TLBDETAIL
    GO
    </pre&gt

    Comment


    • #3
      Danke für die für die Antwort und das Beispiel..

      und zu dem Beispiel habe ich gleich noch eine Frage..

      <PRE>
      CREATE TRIGGER trTLBMASTER ON TLBMASTER INSTEAD OF DELETE
      AS
      BEGIN
      -- Schritt 1: Zuerst die Detail-Datensätze löschen
      DELETE FROM TLBDETAIL
      WHERE MID IN (SELECT MID FROM deleted)
      -- Schritt 2: Danach den Master-Datensatz löschen
      DELETE FROM TLBMASTER
      WHERE MID IN (SELECT MID FROM deleted)
      END
      </PRE>

      dieser Trigger wird doch durch die DELETE-Anweisung auf der Tabelle TLBMASTER angestoßen..

      Warum mus man hier auch noch im TRIGGER die ursprüngliche DELETE-Anweisung (Schritt 2) ausführen? Wird diese nicht nach dem Ausführen des TRIGGER's sowieso ausgeführt, da diese ja den TRIGGER ausgelöst hat

      Comment


      • #4
        Hallo,

        &gt;...Wird diese nicht nach dem Ausführen des TRIGGER's sowieso ausgeführt.

        nein - nicht umsonst nennt sich das Teil INSTEAD OF-Trigger (anstelle von). Der Trigger <b>ersetzt</b> die DELETE-Anweisung vollständig, d.h. diese Anweisung kommt niemals bei der Tabelle oder dem View an.

        Der Microsoft SQL Server 2000 unterscheidet sich beim Thema Trigger von anderen Datenbanken (wie zum Beispiel dem InterBase). Es gibt dort zwei Arten von Triggern. Die normalen Trigger sind alle After-Trigger, die erst nach der eigentlichen Aktion (UPDATE, INSERT oder DELETE) ausgelöst werden. Wenn aber Spaltenwerte vor dem Schreibvorgang auf die Tabelle vom Trigger ausgetauscht werden sollen, muss man zum INSTEAD OF-Trigger greifen. Beim Microsoft SQL Server sind im Trigger zwei Hilfstabellen sichtbar. Die Tabelle <b>Inserted</b> enthält die neu hinzugekommenen bzw. geänderten Datensätze, während die Tabelle <b>Deleted</b> die gelöschten Datensätze enthält. Somit kann der Trigger über einen Join direkt auf die Daten zugreifen. Die Syntax ist zwar komplizierter als beim InterBase, dafür sind INSTEAD OF-Trigger aber flexibler, da sie zum Beispiel auch Schreibzugriffe auf Views erlauben, die ohne diese Trigger nicht möglich wären

        Comment

        Working...
        X