Announcement

Collapse
No announcement yet.

ID und TRIGGER BEFORE DELETE

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

  • ID und TRIGGER BEFORE DELETE

    Hi,

    Ich möchte unter MSSQL einen Trigger erstellen, der automatisch, wenn von der
    Haupttabelle ein Datensatz mit einem bestimmten ID gelöscht wird, in einer anderen Tabelle
    alle Datensätze die den Verweis auf diese ID haben auch gelöscht werden.

    Ich weiss wie es unter Interbase auszusehen hat:

    CREATE TRIGGER HAUPTTBL_DELETE FOR HAUPTTBL
    ACTIVE BEFORE DELETE POSITION 0
    AS
    BEGIN
    DELETE FROM UNTERTBL WHERE UNTERTBL.HAUPTTBL_ID=HAUPTTBL.ID;
    END

    doch wie kann ich das gleiche unter MsSQL herstellen?

    mfg

    Klaus Bürkle

  • #2
    Hallo,

    der MS SQL Server 2000 unterstützt 2 Trigger-Arten: <br>
    1. Normale Trigger, die aber alle AFTER-Trigger sind <br>
    2. INSTEAD OF-Trigger, die u.a. als Ersatz für BEFORE-Trigger eingesetzt werden können.

    Beispiele für INSTEAD OF-Trigger lassen sich hier im FORUM über die Suche nach der Zeichenkette "INSTEAD OF" finden.

    Die Aufgabe kann aber auch ohne Trigger über eine kaskadierende Referenzintegritätsbeziehung zwischen den beiden Tabellen gelöst werden

    Comment


    • #3
      Hallo Hr. Kosch<br><br>Vielen Dank für deinen Hinweis ... jedoch war ich auch schon einmal so weit ... und ich weiss die SQL-Befehle immer noch nicht, die ich benötige.<br><br>Kannst Du mir vielleicht ein Beispiel geben

      Comment


      • #4
        Hallo,

        das folgende Beispiel demonstriert diese Technik. Wenn der MASTER-Datensatz gelöscht wird, räumt der INSTEAD OF-Trigger alle DETAIL-Datensätze ab, die den gleichen MID-Wert verwenden:
        <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: Danache 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


        • #5
          Hallo Hr. Kosch,<br><br>Vielen Dank für Ihre Ausführliche Antwort. Das ist genau das, was ich gesucht habe :-)<br><br>Die DELETE ... WHERE ... <b>IN (SELECT ...)</b> Syntax ist so einfach und doch so kompliziert.<br&gt

          Comment


          • #6
            Und übrigens. Ihres neuste Buch: „InterBase 6“ ist für mich eine große Hilfe ;-)

            Mit freundlichen Grüßen

            Klaus Bürkl

            Comment

            Working...
            X