Announcement

Collapse
No announcement yet.

Create trigger mit PL/SQL - problem mit Zeitraum

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

  • Create trigger mit PL/SQL - problem mit Zeitraum

    Hallo zusammen,

    meine PL/SQL Kenntnisse sind leider nicht so gut und deswegen habe ich das folgende Problem:

    Ich habe eine Tabelle "triggertest" diese sieht so aus:
    Code:
    CREATE TABLE TRIGGERTEST
       (
          AUFTRAGID NUMBER(38,0) NOT NULL, 
          AUFVON TIMESTAMP (6), 
          AUFBIS TIMESTAMP (6), 
          ZAHLDATUM TIMESTAMP (6), 
          KUNDENID NUMBER(38,0) NOT NULL, 
          CONSTRAINT TRIGGERTEST_PK PRIMARY KEY (AUFTRAGID)
       );
    Kurze Info. zu meiner Datenbankversion:
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE 10.2.0.1.0 Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    Diese Tabelle ist eine Art "Bestellungen"-Tabelle. Es geht letzten Endes hierbei nicht um Produkte sondern um Leistungen (in dem Fall um ein Premium Account).
    Die Tabelle hält fest, wann welcher Benutzer (Kunde) einen premium Account hatte und weiterhin hat.
    Das Problem der ganzen Sache ist, dass ich irgendwie es schaffen muss, dass vor dem INSERT INTO geprüft wird, ob der Benutzer bereits einen Auftrag hat (sprich Premium ist) und erst eine weiterer Auftrag eingetragen wird, wenn das Datum (aufbis) vom alten Auftrag kleiner ist als das vom neuen Auftrag.
    Das soll einfach verhiendern, dass ein Kunde nur einen Auftrag zur gleichen zeit haben darf. Überschneidungen möchte ich ebenfalls vermeiden!

    Ein paar Versuche hatte ich schon gestartet, aber leider ohne erfolg:

    Code:
    create or replace
    TRIGGER proof_kundenid_trg
    BEFORE INSERT ON triggertest
      FOR EACH ROW
    BEGIN
      IF :NEW.aufvon >= :NEW.aufbis THEN
        raise_application_error (-20901, 'AuftragVon größer oder gleich AuftragBis');
      ELSIF :NEW.aufbis >= LOCALTIMESTAMP 
            AND :NEW.aufvon >= :OLD.aufvon OR :NEW.aufvon <= :OLD.aufvon
            AND :NEW.aufbis <= :OLD.aufbis OR :NEW.aufbis >= :OLD.aufbis
            AND :OLD.kundenid = :NEW.kundenid THEN
       raise_application_error (-20902, 'Der Unternehmer hat bereits ein premium Account.');
      END IF;
    END;
    Den Bereich "AND :OLD.kundenid = :NEW.kundenid THEN" habe ich separat gestestet gehabt, anscheinend wird er einfach ignoriert.
    Natürlich sind im Trigger noch andere Überprüfungen drin, wie Startdatum des Auftrags darf nicht älter sein als Enddatum.
    Wie gesagt, dass ganze funktioniert nicht so wirklich, der Datensatz wird trozdem eingefügt obwohl ich gegen den ElSIF-Block verstoße!


    Ich würde mich über eure Hilfe sehr freuen!

    Gruß
    Nedo

  • #2
    Ich denke, da sind noch logische Fehler bei der Umsetztung im Trigger, schau vielleicht noch mal ins Handbuch TRIGGER
    In einem INSERT-Trigger macht es doch keinen Sinn nach dem :OLD Wert zu schauen, nur bei einem UPDATE- oder DELETE-Trigger. Zumal Du ja beim INSERT offenbar in den restlichen Tabelleneinträgen suchen willst, ob der Kunde schon einen "passenden" Auftrag hat...

    Comment


    • #3
      Danke für deine Antwort,
      klar dies leuchtet mir jetzt auch ein!
      Anderweitig habe ich noch gehört, dass man Geschäftslogiken garnicht durch Trigger lösen sollte, sondern eher durch Prozeduren....

      Comment


      • #4
        Originally posted by Nedo View Post
        Anderweitig habe ich noch gehört, dass man Geschäftslogiken garnicht durch Trigger lösen sollte, sondern eher durch Prozeduren....
        Ja, ist zwar ein wenig eine philosophische Frage aber die meisten Oracle Gurus sind dieser Meinung. Die Vorteile überwiegen einfach.

        Gruss

        Comment


        • #5
          Gibt es irgendwo diese Liste im Internet (oder als Literatur) mit Vor- und Nachteilen?

          Comment


          • #6
            Gibt es irgendwo diese Liste im Internet (oder als Literatur) mit Vor- und Nachteilen
            Ja hier:
            - Nachteile: Langsam, verstecken von fachlicher Logik, Wartung wird erschwert (es geschen magische Dinge), diverse Operationen nicht möglich (vgl. Mutating Trigger Problematik), Gefahr Constraints nachzuprogrammieren

            -Vorteile: Keine (mal von Quick and Dirty angesehen), aber manchmal geht es nicht anders, in diesem Fall muss man dann eben fachlickeit in einen Trigger packen.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment

            Working...
            X