Announcement

Collapse
No announcement yet.

CREATE TRIGGER - aber wie ???

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

  • CREATE TRIGGER - aber wie ???

    Hallo, Wie kann ich in MsSQL in einem Trigger für <B>UPDATE</B> ein Feld bestücken?

    Unter Oracle und Interbase ist dies kein Problem, jedoch möchte dies unter
    MsSQL nicht funktionieren???

    Beispiel Oracle: <BR>

    CREATE OR REPLACE TRIGGER TABLE1_UPDATE <BR>
    BEFORE UPDATE ON TABLE1 FOR EACH ROW <BR>
    BEGIN <BR>
    :NEW.AENDDATUM := SYSDATE; <BR>
    IF :NEW.TEXT='' THEN <BR>
    :NEW.TEXT := NULL; <BR>
    END IF; <BR>
    END; <BR>

    Beispiel Interbase: <BR>

    CREATE TRIGGERTABLE1_UPDATE FOR TABLE1 <BR>
    BEFORE UPDATE POSITION 0 AS <BR>
    BEGIN <BR>
    NEW.AENDDATUM='NOW'; <BR>
    IF (NEW.TEXT='') THEN <BR>
    NEW.TEXT=NULL; <BR>
    END^ <BR>

    Bitte um Hilfe <BR>

    mfg <BR>

    Klaus Bürkle

  • #2
    Der Microsoft SQL Server 2000 unterscheidet sich beim Thema Trigger vom InterBase. Es gibt 2 Arten von Triggern: <br>
    - Before-Trigger: INSTEAD OF-Trigger <br>
    - After-Trigger: Trigger <br>
    Die "normalen" Trigger sind somit alle After-Trigger, die erst nach der eigentlichen Aktion (UPDATE, INSERT oder Delete) ausgelöst werden. Die folgenden Hilfstabellen sind innerhalb des Triggers sichtbar: <br>
    - <b>inserted</b> = Enthält die neu hinzugekommenen Datensätze <br>
    - <b>deleted</b> = Enthält die gelöschten bzw. geänderten Datensätze

    Wenn man also Spaltenwerte <b>vor</b> dem UPDATE-Schreibvorgang in einem Trigger austauschen will, muss man zum INSTEAD OF-Trigger greifen. Das folgende Beispiel demonstriert dies:

    <pre>
    USE tempdb
    GO
    CREATE TABLE TriggerTestTbl (
    TblID INTEGER NOT NULL IDENTITY PRIMARY KEY CLUSTERED,
    Wert VARCHAR(10),
    Zeitpunkt DATETIME)
    GO
    INSERT INTO TriggerTestTbl (Wert, Zeitpunkt) VALUES ('Test', CURRENT_TIMESTAMP)
    GO
    SELECT * FROM TriggerTestTbl
    GO

    CREATE TRIGGER trTriggerTestTblUpd ON TriggerTestTbl INSTEAD OF UPDATE
    AS
    BEGIN
    -- Fall 1
    IF (SELECT COUNT(*) FROM Inserted WHERE Wert = '') > 0
    BEGIN
    UPDATE TriggerTestTbl
    SET Wert = NULL, Zeitpunkt = CURRENT_TIMESTAMP
    FROM TriggerTestTbl AS t JOIN Inserted AS i ON i.TblID = t.TblID
    END
    -- Fall 2
    IF (SELECT COUNT(*) FROM Inserted WHERE Wert <> '') > 0
    BEGIN
    UPDATE TriggerTestTbl
    SET Wert = i.Wert, Zeitpunkt = CURRENT_TIMESTAMP
    FROM TriggerTestTbl AS t JOIN Inserted AS i ON i.TblID = t.TblID
    END
    END
    GO

    UPDATE TriggerTestTbl SET Wert = ''
    GO
    SELECT * FROM TriggerTestTbl WHERE Wert IS NULL
    GO
    </pre>
    &#10

    Comment


    • #3
      Guten Tag Herr Kosch,<br><br>Ich bedanke mich sehr für die Ausführliche und Vollständige Antwort auf meine Frage.<br><br>Ich konnte dieses Beipsiel unter MSSQL2000 problemlos nachvollziehen.<br><br>Anmerkung: Im Create Trigger kennt MsSQL6.5 den Befehl "INSTEAD" nicht, nach dem Update auf MsSQL2000 lief es aber.<br><br>Dankeschön<br>K.Bürkle<br&gt

      Comment

      Working...
      X