Announcement

Collapse
No announcement yet.

Firebird Trigger tut nicht was er soll

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

  • Firebird Trigger tut nicht was er soll

    Hallo,

    ich habe in einer Datenbank eine Spalte die immer um eins erhöht wird wenn eine bestimmte Änderung vollzogen wird. Wenn dies geschieht soll ein Trigger in einer anderen Spalte die aktuelle Zeit speichern. ich habe mir dazu einen Trigger gebaut, der funktioniert aber leider nicht. Ich denk die IF-Abfrage ist nicht richtig.

    Code:
    SET TERM ^ ;
    
    CREATE TRIGGER BILL_UPDATE_LASTMODIFIED FOR "Bill"
    ACTIVE BEFORE UPDATE POSITION 0
    AS
    BEGIN
    IF (NEW."GCRecord" = OLD."GCRecord"+1) THEN
      NEW.LASTMODIFIED = current_time;
    END^
    
    SET TERM ; ^
    Kann mir jemand sagen wo mein Fehler liegt?

    MfG

    Boris

  • #2
    Hallo,

    hast du berücksichtigt, dass ein Trigger erst bei einem COMMIT feuert?


    Thomas
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Wie meinst du das?

      Comment


      • #4
        hmm ok, aber müsste er dann nicht trotzdem auslösen?
        Die Änderungen bei Spalte "GCRecord werden ja gemacht. Und mit "NEW." und "OLD." kann ich doch in dem IF-Statement bestimmen ob er ausgelöst wird oder nicht.
        Nach dem Commit sind die Änderungen ja vollzogen, aber in OLD.GCRecord steht noch der alte Wert, oder nicht?

        Comment


        • #5
          Hallo,

          eigentlich war mein letzter Kommentar nicht ganz richtig. Änderungen vom Trigger sollten in der selben Transaktion auch sichtbar sein, allerdings werden die Änderungen des Triggers für andere Transaktionen erst bei einem Commit sichtbar.

          Also, wie verifizierst du, dass der Trigger nicht das macht, was er tun soll? Vielleicht tut er ja, aber du siehst einfach, aufgrund eines Transaktionsproblems in deiner Anwendung, die Änderung des Triggers nicht.

          Thomas
          Thomas Steinmaurer

          Firebird Foundation Committee Member
          Upscene Productions - Database Tools for Developers
          Mein Blog

          Comment


          • #6
            Die aktuelle Zeit wird nicht in die Spalte LASTMODIFIED geschrieben. Der Wert von GCRecord wird aber um 1 erhöht.
            Wenn ich die IF-Abfrage rausnehme schreibt er den Wert auch rein, also liegt es wohl am IF. Kann man bei Triggern irgendwie debuggen, oder Ausgaben machen? hab noch nicht sehr viel Erfahrung mit Triggern.

            MfG

            Boris

            Comment


            • #7
              Versuchs mal mit

              Code:
              IF (NEW.GCRECORD = OLD.GCRECORD+1)
              anstelle

              Code:
              IF (NEW."GCRecord" = OLD."GCRecord"+1)
              Vorausgesetzt es existiert eine Tabellenspalte mit dem Namen GCRECORD

              Comment


              • #8
                Nein, das ist es leider nicht. Die Spalten heißen wirklich so.
                Die Datenbank wird durch eine OR-Mapping-Komponente erstellt, daher die Spaltennamen mit Anführungszeichen.

                [EDIT]
                Ich habe den Fehler gefunden. Ich habe die Spalte nicht richtig angegeben.


                Trotzdem Danke für Eure Hilfe


                MfG

                Boris
                Zuletzt editiert von Boris0815; 10.03.2009, 12:26.

                Comment

                Working...
                X