Jump to content
Coldasice

Datensätze vor Update prüfen

Recommended Posts

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ß

Share this post


Link to post

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

 

Edited by MDD

Share this post


Link to post
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.

Share this post


Link to post

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.

Share this post


Link to post
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!

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...