Announcement

Collapse
No announcement yet.

Fragen zu Trigger

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

  • Fragen zu Trigger

    Hallo,

    ich habe leider kaum Erfahrung mit dem SQL Server. Ich möchte auf Änderungen in einer Tabelle der Datenbank reagieren - z.B. den geänderten Datensatz in ein TextFile schreiben. Nun könnte ich das abspeichern an jeder Stelle des Programmes wo es auftreten könnte abfangen .... .

    Ich dachte ein Trigger auf diese Tabelle zu setzen und dann die Aktionen auszuführen müsste der weitaus bessere Weg sein.

    Kennt jemand irgend einen hilfreichen Link zu einer Beschreibung oder kann mir ggf. helfen, wie ich diesen Trigger erzeuge und entsprechend meine DAten formatieren und exportieren kann.

    Ich benutze wie schon erwähnt MSDE oder SQL Server und entwickle in Delphi (oder hilfsweise auch VB6)

    Heiko

  • #2
    Hallo,
    der MS SQL Server unterstützt 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. 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 direkt auf die Daten zugreifen, da die beiden virtuellen Hilfstabellen die gleichen Spalten haben, wie die Basistabelle.
    Ein UPDATE-Trigger wird immer dann ausgelöst, wenn eine UPDATE-Anweisung für eine Tabelle ausgeführt wird. Der Trigger muss daher sowohl bei der Aktualisierung eines einzigen Datensatzes als auch bei der Aktualisierung einer Menge korrekt arbeiten, da der Trigger nicht für jeden vom UPDATE betroffenen Datensatz einzeln aufgerufen wird.
    Mit dem Microsoft SQL Server 2005 kann ein Trigger auch als in .NET geschriebene Assembly-DLL implementiert werden. In diesem Fall steht der Funktionsumfang der Klassen aus dem .NET Framework zur Verfügung.
    <br>
    Das folgende Beispiel demonstriert das Prinzip das UPDATE-Triggers:
    <pre>
    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">CREATE TABLE </span>UpdateTriggerDemo</p><p style="margin: 0px;">(</p><p style="margin: 0px;">&nbsp; rec_id&nbsp; <span style="color: blue;">INTEGER </span>&nbsp;&nbsp;&nbsp; <span style="color: blue;">NOT NULL IDENTITY PRIMARY KEY</span>,</p><p style="margin: 0px;">&nbsp; wert&nbsp;&nbsp;&nbsp; NVARCHAR(9) <span style="color: blue;">NOT NULL</span>,</p><p style="margin: 0px;">&nbsp; datum&nbsp;&nbsp; <span style="color: blue;">DATETIME</span></p><p style="margin: 0px;">)</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.UpdateTriggerDemo (wert) <span style="color: blue;">VALUES </span>(<span style="color: maroon;">'Test1'</span>);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.UpdateTriggerDemo (wert) <span style="color: blue;">VALUES </span>(<span style="color: maroon;">'Test2'</span>);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.UpdateTriggerDemo (wert,datum) <span style="color: blue;">VALUES </span>(<span style="color: maroon;">'Test3'</span>,<span style="color: blue;">CURRENT_TIMESTAMP</span>);</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">CREATE TRIGGER </span>trUpdateTriggerDemp_UPD <span style="color: blue;">ON </span>dbo.UpdateTriggerDemo</p><p style="margin: 0px;"><span style="color: blue;">FOR UPDATE</span></p><p style="margin: 0px;"><span style="color: blue;">AS</span></p><p style="margin: 0px;">&nbsp; <span style="color: blue;">UPDATE </span>dbo.UpdateTriggerDemo <span style="color: blue;">SET </span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; datum = <span style="color: blue;">GETDATE</span>()</p><p style="margin: 0px;">&nbsp; <span style="color: blue;">FROM </span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; dbo.UpdateTriggerDemo S</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: blue;">JOIN </span>Inserted I <span style="color: blue;">ON </span>I.rec_id = S.rec_id</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">UPDATE </span>dbo.UpdateTriggerDemo <span style="color: blue;">SET</span></p><p style="margin: 0px;">&nbsp; wert = <span style="color: maroon;">'Neu2'</span></p><p style="margin: 0px;"><span style="color: blue;">WHERE</span></p><p style="margin: 0px;">&nbsp; rec_id &gt; 2</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>* <span style="color: blue;">FROM </span>dbo.UpdateTriggerDemo&nbsp; </p><p style="margin: 0px;">GO</p></div>
    </pre&gt

    Comment


    • #3
      Danke, das war sehr plausibel und ist ein Schritt in die Richtung in die ich will.

      Nun bekomme ich mit, wenn in meiner Tabelle Daten verändert werden. Ich müsste nun mit dem Auslösen des Triggers ene Textdatei aufzeichen. Ein VB-Codefragment ist dazu bereits verfügbar. Kann ich diesen Source-Code in eine stored-procedure aufnehmen, oder muss ich alles inSQL-Scripts umsetzen damit meine Datei über den Trigger von der SP erstellt wird?

      Heik

      Comment


      • #4
        Hallo,
        im Fall der Versionen 7.0 und 2000 des MS SQL Server sind im Trigger nur T-SQL-Anweisungen erlaubt. Allerdings können dort eigene als DLL bzw. COM-Objekt implementierte Funktionen aufgerufen werden, da T-SQL den Aufruf derartigen Erweiterungen erlaubt.
        Erst mit dem MS SQL Server 2005 kann ein Trigger auch in VB.NET geschrieben werden, so dass dort die Einschränkung auf den T-SQL-Funktionsumfang entfällt.
        <br>
        Der Aufruf eines in VB6 geschriebenen COM-Objekts, in dem eine Methode für das Schreiben der Datei implementiert wird, könnte zum Beispiel so aussehen:
        <pre>
        Declare @Object int, @hr int, @RetVal int, @iStatus int
        SET @iStatus = 1
        -- Objektinstanz erzeugen
        Exec @hr = sp_OACreate '{0E9447C4-EF22-4570-B202-45D50D3B5EFB}', @Object OUTPUT
        IF @hr = 0
        BEGIN
        SET @iStatus = 2
        END
        -- Interface-Methode (Property) abfragen
        Exec @hr = sp_OAGetProperty @Object, 'Daten', @sTXT OUTPUT
        IF @hr=0
        BEGIN
        SET @iStatus = 3
        END
        -- Methode des COM-Objekt ausführen
        Exec @hr = sp_OAMethod @Object, 'DoWork'
        IF @hr=0
        BEGIN
        SET @iStatus = 4
        END
        Exec @hr = sp_OADestroy @Object
        </pre&gt

        Comment

        Working...
        X