Announcement

Collapse
No announcement yet.

Trigger einfachen Wert setzen

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

  • Trigger einfachen Wert setzen

    Hallo Freunde der Sonne,

    anscheinend bekomme ich heute garnicht auf die Reihe.
    Ich versuche krampfhaft in einem Trigger MSDE2000 den Wert eines Feldes in einer Tabelle zu setzen. Wenn der Anwender daten in einem Datensatz ändert soll automatisch das Feld letzte_bearbeitung (DateTime) gesetzt werden.

    Wie komme ich am schnellsten zu einem Ergebnis.

    cu Jan
    und lasst euch nicht blenden (von der Sonne)

  • #2
    Hallo,

    Der Microsoft SQL Server 2000 unterscheidet sich beim Thema Trigger von anderen SQL-Datenbanken. 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 UPDATE-Schreibvorgang auf die Tabelle vom Trigger ausgetauscht werden sollen, muss man zum INSTEAD OF-Trigger greifen. Die geschilderte Aufgabe lässt sich jedoch mit einem ganz normalen Trigger umsetzen. Allerdings muss man beachten, dass der Trigger im Worst Case auch für eine vollständige Datenmenge zuständig ist. Der Trigger wird unabhängig von der Anzahl der betroffenen Datensätze immer nur einmal am Ende gefeuert - damit aber dieses Verhalten nicht zum Problem wird, tauchen im Kontext eines Trigger zwei virtuelle Tabellen auf. 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 könnte der Trigger über einen Join direkt auf die Daten zugreifen, aber das ist in unserem Fall gar nicht notwendig, wie das folgende Beispiel zeigt:
    A) Testtabelle vorbereiten
    <pre>
    <b>USE</b> tempdb
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> TestTbl
    (
    recid <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
    wert <b>VARCHAR</b>(9) <b>NOT</b> <b>NULL</b>,
    datum DATETIME <b>NOT</b> <b>NULL</b> <b>DEFAULT</b> <b>CURRENT_TIMESTAMP</b>
    )
    <b>GO</b>
    <b>INSERT</b> <b>INTO</b> dbo.TestTbl (wert) <b>VALUES</b> (<font color="#9933CC">'Eintrag 1'</font>)
    <b>INSERT</b> <b>INTO</b> dbo.TestTbl (wert) <b>VALUES</b> (<font color="#9933CC">'Eintrag 2'</font>)
    <b>INSERT</b> <b>INTO</b> dbo.TestTbl (wert) <b>VALUES</b> (<font color="#9933CC">'Eintrag 3'</font>)
    <b>GO</b>
    </pre>
    B) Trigger aktivieren <br>
    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. Dies ist immer dann wichtig, wenn der Trigger nicht nur einen Datensatz bearbeiten muss, sondern eine Datenmenge. Über die <b>IN</b>-Abfrage der virtuellen Tabelle <b>Inserted</b> ermittelt der Trigger alle zu aktualisierenden Datensätze:
    <pre>
    <b>CREATE</b> <b>TRIGGER</b> trTestTblUpdate <b>ON</b> dbo.TestTbl <b>FOR</b> <b>UPDATE</b>
    <b>AS</b>
    <b>IF</b> (@@ROWCOUNT = 0)
    <b>RETURN</b>
    <b>BEGIN</b>
    <b>UPDATE</b>
    dbo.TestTbl
    <b>SET</b>
    datum = <b>CURRENT_TIMESTAMP</b>
    <b>WHERE</b> recid <b>IN</b> (<b>SELECT</b> recid <b>FROM</b> INSERTED)
    <b>END</b>
    <b>GO</b>
    </pre>
    C) Trigger testen
    <pre>
    <p><font color="#008080">-- Trigger testen</font><br>
    UPDATE dbo.TestTbl SET wert = 'Neu 2' WHERE recid = 2<br>
    SELECT * FROM dbo.TestTbl<br>
    <br>
    <font color="#008080">-- Trigger beim Mehrfach-Update testen</font><br>
    UPDATE dbo.TestTbl SET wert = 'Neu 2' WHERE recid &gt; 1<br>
    SELECT * FROM dbo.TestTbl</p>
    </pre&gt

    Comment


    • #3
      Hallo Andreas,

      wunderbar, so stelle ich mir eine Hilfe vor. Aufgrund der Hilfe haben sich auch einige neue Möglichkeiten eröffnet.
      Besten Dank

      cu Ja

      Comment

      Working...
      X