Jump to content

Datensätze vor Update prüfen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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ß

Link zu diesem Kommentar

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

 

bearbeitet von MDD
Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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!

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...