Frage

Ich hatte nur ein paar Kopfschmerzen bei der Implementierung eines Triggers in einer alten Version von Sybase und fragte mich, ob jemand helfen könnte.Kurz gesagt, ich möchte einen Trigger schreiben, der einen weiteren Sproc für jeden der betroffenen Datensätze aufruft (unabhängig davon, ob er eingefügt, gelöscht oder beides [aktualisiert]) wird.

Eine Möglichkeit, dies in T-SQL (SQL Server) zu tun, wäre die Verwendung eines Cursors, aber keines der Cursor-Beispiele, die ich im Internet gefunden habe, scheint tatsächlich unter Sybase ASA 6.0.4 zu funktionieren – entweder mag es T-SQL nicht im Allgemeinen oder es scheint zu kompilieren, tut aber im Allgemeinen nichts (selbst bei pathologisch einfachen, erfundenen Szenarien).

Im Wesentlichen möchte ich alle „eingefügten“ Tabellendatensätze (falls vorhanden) und für jeden einzelnen durchlaufen Exec MySproc (inserted.keyid), durchlaufen Sie dann alle „gelöschten“ Tabellendatensätze (falls vorhanden) und noch einmal für jeden einzelnen Exec MySproc (deleted.keyid).

Hat jemand ein Beispiel dafür oder auch nur für die Verwendung eines schreibgeschützten Cursors in ASA 6?Das Online-Handbuch scheint ein Beispiel für einen einfachen Cursor zu enthalten, aber in der Praxis ist es mir nicht gelungen, das Beispiel tatsächlich zum Laufen zu bringen.ICH könnte Rollen Sie den anderen Sproc in den Trigger aus (es ist eigentlich nicht so kompliziert), aber es ist zu kompliziert, um es als Teil einer Anweisung vom Typ „Ausgewählt aus eingefügten ...“ durchzuführen – es handelt sich tatsächlich um ein paar Zeilen Code für sich.Daher denke ich, dass ich sowieso einen Cursor brauche.

BEARBEITEN:(29.12.09) – Am Ende habe ich aus Verzweiflung den Sproc-Code entrollt, aber ich hätte wirklich gerne ein funktionierendes Cursor-Beispiel in Sybase ASA 6, weil ich früher oder später mit etwas konfrontiert werde, das ich nicht so einfach lösen kann abrollen. Also werde ich das als Kopfgeld auswerfen – kann jemand Gib mir ein funktionierendes Beispiel? :-)

War es hilfreich?

Lösung

Es hört sich so an, als ob Sie nach einem ROW LEVEL-Trigger suchen.

Standardmäßig sind Trigger in ASA auf Anweisungsebene (der Trigger wird einmal ausgeführt, nachdem die gesamte auslösende Anweisung abgeschlossen ist).Trigger auf Zeilenebene hingegen werden einmal für jede geänderte Zeile ausgeführt.

Hier ist ein Beispiel für einen Trigger auf Zeilenebene:

CREATE TRIGGER tr_log
AFTER UPDATE OF "myfield"
ON mytable
REFERENCING OLD AS old_data NEW AS new_data

FOR EACH ROW

BEGIN
    Insert into Narc_USER_INFO_Change (Field_Changed, New_Value, Original_Value, user)
    Values('myfield', new_data.myfield,  old_data.myfield, CURRENT USER);
END
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top