Coldasice 12 Geschrieben 22. Februar 2021 Melden Teilen Geschrieben 22. Februar 2021 Hi zusammen, ich habe eine Aufgabe, die ich vermutlich nicht ohne etwas hilfe gestemmt bekomme. Und zwar möchte ich auf einer speziellen Tabelle einen Check des aktualisierten und originalen Datensatzes (ggf. auch mehr als einer) machen. Sprich, ein Datensatz wird in der Anwendung gespeichert und in diesem Zuge soll geprüft werden, ob ein Feld in dem neuen Datensatz wie auch im alten einen gewissen Zustand hat. Wenn ein gewisser Zustand eintritt, wird eine Meldung geworfen und zusätzlich wird das auch noch in einem Log protokolliert. Da ich den Trigger von Oracle überführen möchte, habe ich schon vieles in der Hand: Der Trigger sieht wie folgt aus: CREATE OR REPLACE TRIGGER tr_relDb_LNr BEFORE Update ON relDb REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE voFileDir VARCHAR2 (255) := 'D:\infor\trigger_relDB'; voFileName VARCHAR2 (255) := 'tr_relDb_LNr.log'; OsUserName VARCHAR2 (20); OsUserHost VARCHAR2 (40); oLogFile utl_file.file_type; BEGIN IF (:OLD.ZUST > 3 AND :NEW.LNr <> :OLD.LNr) THEN RAISE_APPLICATION_ERROR (-20001, 'tr_relDb_LNr: Es wurde versucht den Arbeitsplatz zu aendern. IK: ' || :OLD.IK || ', LNr: ' || :OLD.LNr || ' Bitte wenden Sie sich an Ihren Administrator! (Incident 15169168).'); oLogFile := utl_file.fopen (voFileDir, voFileName, 'a'); utl_file.put_line (oLogFile,TO_CHAR(SYSDATE,'DD.MM.YYYY HH24:MI:SS') || '; IK: ' || :OLD.IK || '; Auftrag: ' || :OLD.ANr || '; LNr: ' || :OLD.LNr); utl_file.fclose (oLogFile); END IF; END; / Ein before update gibt es in SQL Server nicht, nur das Instead of, das dem nahe kommt. Das ist aber an dieser Stelle mMn. total fehl am Platz, denn ich will den Datensatz ja nicht modifizieren sondern eigentlich nur eine Meldung raushaun, wenn etwas eintritt. Die Hauptfrage ist, kann ich dafür überhaupt einen Trigger nehmen oder muss ich da anders ran? Mir fehlt hier einfach der Ansatz. Ich bastle gerne mit soetwas herum, aber dazu bräuchte ich einen Ansatz, ein Stichwort mit dem ich mich beschäftigen könnte. Hat zufälligerweise jemand ein solchen Stichwort für mich :) ? Gruß Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 22. Februar 2021 Melden Teilen Geschrieben 22. Februar 2021 (bearbeitet) Hallo du kannst innerhalb des Triggers auf die alten Daten (DELETED.ZUST) und auf die neuen (UPDATED.LNr) Bezug nehmen und nach Prüfung entsprechende Aktionen setzen. Kannst entweder im Trigger machen oder auch über eine SP, was zum Debuggen leichter ist und mir immer klarer erscheint als ein Trigger. Du kannst theoretisch auch mit der Output-Klausel arbeiten. Zitat https://docs.microsoft.com/de-de/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15 bearbeitet 22. Februar 2021 von MDD Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 22. Februar 2021 Melden Teilen Geschrieben 22. Februar 2021 Wieso Trigger und kein Constraint? Zitieren Link zu diesem Kommentar
Coldasice 12 Geschrieben 23. Februar 2021 Autor Melden Teilen Geschrieben 23. Februar 2021 vor 18 Stunden schrieb Dukel: Wieso Trigger und kein Constraint? Genau das will ich rausfinden, also welche Möglichkeiten es gibt. Ich glaube aber, da fehlt mir dann das Log und auch die eigens definierte Ausage, oder? Zumindest habe ich nichts dazu gefunden. vor 19 Stunden schrieb MDD: Hallo du kannst innerhalb des Triggers auf die alten Daten (DELETED.ZUST) und auf die neuen (UPDATED.LNr) Bezug nehmen und nach Prüfung entsprechende Aktionen setzen. Kannst entweder im Trigger machen oder auch über eine SP, was zum Debuggen leichter ist und mir immer klarer erscheint als ein Trigger. Du kannst theoretisch auch mit der Output-Klausel arbeiten. Das mit der SP schaue ich mir mal an. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 23. Februar 2021 Melden Teilen Geschrieben 23. Februar 2021 Du willst ja ein Update verhindern, wenn bestimmte Voraussetzungen gegeben sind. Das ist ja auch die Aufgabe eines Constraint. Wie du das aber genau umsetzen kannst, kann ich leider nicht sagen. Zitieren Link zu diesem Kommentar
Coldasice 12 Geschrieben 23. Februar 2021 Autor Melden Teilen Geschrieben 23. Februar 2021 vor 5 Minuten schrieb Dukel: Du willst ja ein Update verhindern, wenn bestimmte Voraussetzungen gegeben sind. Das ist ja auch die Aufgabe eines Constraint. Wie du das aber genau umsetzen kannst, kann ich leider nicht sagen. Ich möchte aber auch noch ein wenig mehr, nämlich das Log und auch die frei definierbare Ausgabe, das geht mit dem Constraint glaube ich nicht. Ich schaue aber nochmal, werde mich aber erst mit der SP beschäftigen. Aber danke dir für den Input! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.