Announcement

Collapse
No announcement yet.

Firebird 2.5 drop table geht nicht mit Update Triggern

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

  • Firebird 2.5 drop table geht nicht mit Update Triggern

    Hallo,

    habe ein Problem mit der neuen Firebird 2.5 Datenbank.
    Ich habe eine Tabelle bei der 4 Trigger definiert sind.
    Einer dieser Trigger scheint zu verursachen, dass ich die Tabelle nicht löschen kann. Es kommt dann immer die Fehlermeldung, dass die Tabelle in Verwendung wäre. (in use)

    Das ganze passiert auch nur dann, wenn Daten eingefügt wurden und der Trigger aktiv geworden ist. Starte ich das Programm ohne Daten einzufügen kann ich die Tabelle löschen.

    Beim löschen der Tabelle gehe ich folgendermaßen vor:
    - Zuerst lösche ich die bestehenden Trigger (DROP TRIGGER x)
    - Dann noch die bestehenden Sequences
    - Dann erst die Tabelle.
    Das lustige ist, dass icch die Trigger alle gelöscht bekomme aber diese trotzdem noch in der Systemtabelle RDB$CHECK_CONSTRAINTS alle drin stehen. Und vernutlich weil diese Abhängigkeit noch eibgetragen ist kann ich die Tabelle selbst nicht löschen!


    Der Trigger den es betrifft sieht so aus:
    SET SQL DIALECT 3;

    SET TERM ^ ;


    CREATE OR ALTER TRIGGER ATM3_UD FOR ATM3
    ACTIVE AFTER INSERT POSITION 0
    AS BEGIN UPDATE ATM3 SET TSA_HOST=new.TSA_HOST, CARDNUMBER=new.CARDNUMBER, ACCOUNT=new.ACCOUNT, BANK=new.BANK, COUNTRY=new.COUNTRY, CURRENCY=new.CURRENCY, AMOUNT=new.AMOUNT WHERE TR_SEQ=new.TR_SEQ AND TR_TS>=(new.TR_TS-15.000000/1440); END
    ^

    SET TERM ; ^



    Die Tabelle so:


    CREATE GENERATOR ATM3_COUNTER;
    CREATE GENERATOR ATM3_RBRECSIZE;
    CREATE GENERATOR ATM3_ID;

    CREATE TABLE ATM3 (
    ID BIGINT NOT NULL,
    TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    SYSTEM VARCHAR(129) NOT NULL,
    BRANCH VARCHAR(129) DEFAULT NULL,
    BRANCH_ID VARCHAR(32) DEFAULT NULL,
    CAMERA INTEGER DEFAULT 0,
    PIC_TS TIMESTAMP DEFAULT NULL,
    PIC_SIZE INTEGER DEFAULT 0,
    PIC_TYPE VARCHAR(33) DEFAULT NULL,
    RBNAME VARCHAR(51) DEFAULT NULL,
    RBPOSITION VARCHAR(21) DEFAULT NULL,
    RBPICINDEX INTEGER DEFAULT 0,
    ATM_NUMBER INTEGER NOT NULL,
    ATM_ID VARCHAR(41) DEFAULT NULL,
    TR_TS TIMESTAMP NOT NULL,
    TR_DATE DATE NOT NULL,
    TR_TIME TIME NOT NULL,
    TR_SEQ BIGINT NOT NULL,
    TSA_ATM INTEGER,
    TSA_HOST INTEGER,
    CARDNUMBER INTEGER DEFAULT 0,
    ACCOUNT VARCHAR(21) NOT NULL,
    BANK VARCHAR(21) NOT NULL,
    COUNTRY VARCHAR(11) DEFAULT NULL,
    CURRENCY VARCHAR(11) DEFAULT NULL,
    AMOUNT VARCHAR(21) DEFAULT NULL,
    VSP INTEGER,
    TELEGRAM VARCHAR(257) DEFAULT NULL
    );




    /************************************************** ****************************/
    /* Primary Keys */
    /************************************************** ****************************/

    ALTER TABLE ATM3 ADD PRIMARY KEY (ID);


    /************************************************** ****************************/
    /* Indices */
    /************************************************** ****************************/

    CREATE INDEX ATM3_IDX1 ON ATM3 (ID);
    CREATE INDEX ATM3_IDX10 ON ATM3 (TSA_ATM);
    CREATE INDEX ATM3_IDX11 ON ATM3 (TSA_HOST);
    CREATE INDEX ATM3_IDX12 ON ATM3 (TR_SEQ);
    CREATE INDEX ATM3_IDX13 ON ATM3 (ACCOUNT);
    CREATE INDEX ATM3_IDX14 ON ATM3 (BANK);
    CREATE INDEX ATM3_IDX15 ON ATM3 (AMOUNT);
    CREATE DESCENDING INDEX ATM3_IDX2 ON ATM3 (ID);
    CREATE INDEX ATM3_IDX3 ON ATM3 (TR_TS, TR_SEQ, ID);
    CREATE INDEX ATM3_IDX4 ON ATM3 (TR_TS);
    CREATE DESCENDING INDEX ATM3_IDX5 ON ATM3 (TR_TS);
    CREATE INDEX ATM3_IDX6 ON ATM3 (TS);
    CREATE INDEX ATM3_IDX7 ON ATM3 (BRANCH, BRANCH_ID);
    CREATE INDEX ATM3_IDX8 ON ATM3 (CAMERA);
    CREATE INDEX ATM3_IDX9 ON ATM3 (ATM_NUMBER);


    /************************************************** ****************************/
    /* Triggers */
    /************************************************** ****************************/


    SET TERM ^ ;



    /************************************************** ****************************/
    /* Triggers for tables */
    /************************************************** ****************************/



    /* Trigger: ATM3_AD */
    CREATE OR ALTER TRIGGER ATM3_AD FOR ATM3
    ACTIVE AFTER DELETE POSITION 0
    AS DECLARE VARIABLE genValue BIGINT; BEGIN genValue = GEN_ID(ATM3_COUNTER,-1); if (genValue < 0) then genValue=gen_id(ATM3_COUNTER, -gen_id(ATM3_COUNTER,0)); genValue = GEN_ID(ATM3_RBRECSIZE,-old.pic_size); if (genValue < 0) then genValue=gen_id(ATM3_RBRECSIZE, -gen_id(ATM3_RBRECSIZE,0)); END
    ^


    /* Trigger: ATM3_AI */
    CREATE OR ALTER TRIGGER ATM3_AI FOR ATM3
    ACTIVE AFTER INSERT POSITION 0
    AS DECLARE VARIABLE genValue BIGINT; BEGIN genValue = GEN_ID(ATM3_COUNTER,1); genValue = GEN_ID(ATM3_RBRECSIZE,new.pic_size); END
    ^


    /* Trigger: ATM3_BI */
    CREATE OR ALTER TRIGGER ATM3_BI FOR ATM3
    ACTIVE BEFORE INSERT POSITION 0
    AS BEGIN IF (new.ID is null) THEN new.ID = GEN_ID(ATM3_ID,1); END
    ^


    /* Trigger: ATM3_UD */
    CREATE OR ALTER TRIGGER ATM3_UD FOR ATM3
    ACTIVE AFTER INSERT POSITION 0
    AS BEGIN UPDATE ATM3 SET TSA_HOST=new.TSA_HOST, CARDNUMBER=new.CARDNUMBER, ACCOUNT=new.ACCOUNT, BANK=new.BANK, COUNTRY=new.COUNTRY, CURRENCY=new.CURRENCY, AMOUNT=new.AMOUNT WHERE TR_SEQ=new.TR_SEQ AND TR_TS>=(new.TR_TS-15.000000/1440); END
    ^


    SET TERM ; ^

  • #2
    So habe das nun mit IBExpert und einer kleinen Tabelle mal nachgestellt.
    Damit habe ich das gleiche Problem:

    /************************************************** ****************************/
    /* Generated by IBExpert 08.12.2010 15:11:02 */
    /************************************************** ****************************/

    /************************************************** ****************************/
    /* Following SET SQL DIALECT is just for the Database Comparer */
    /************************************************** ****************************/
    SET SQL DIALECT 3;



    /************************************************** ****************************/
    /* Tables */
    /************************************************** ****************************/



    CREATE TABLE TESTIT (
    ID INTEGER NOT NULL,
    SEQ BIGINT NOT NULL,
    TEXT VARCHAR(100)
    );




    /************************************************** ****************************/
    /* Triggers */
    /************************************************** ****************************/


    SET TERM ^ ;



    /************************************************** ****************************/
    /* Triggers for tables */
    /************************************************** ****************************/



    /* Trigger: TESTIT_AI0 */
    CREATE OR ALTER TRIGGER TESTIT_AI0 FOR TESTIT
    ACTIVE AFTER INSERT POSITION 0
    AS
    begin
    /* Trigger text */
    UPDATE TESTIT SET TEXT=new.TEXT WHERE SEQ=new.SEQ;
    end
    ^


    SET TERM ; ^



    /************************************************** ****************************/
    /* Privileges */
    /************************************************** ****************************/


    /* Privileges of users */
    GRANT ALL ON TESTIT TO INFORM WITH GRANT OPTION;



    Wenn ich nun ein paar Daten in diese Tabelle einfüge, danach den trigger lösche kann ich nicht die Tabelle löschen!

    Hat jemand eine Idee?

    Comment


    • #3
      Hallo,

      es ist immer die Frage, ob andere aktive Transaktionen die Tabelle noch in Verwendung haben, sprich, ob auch die Trigger noch aktiv sind und die Transaktion(en) z.B. noch nicht committed wurden.

      Thomas
      Thomas Steinmaurer

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

      Comment


      • #4
        Nein alle Transaktionen wurden geschlossen. Es sind keine mehr offen. Trotzdem geht es nicht.

        Habe es ja mit einer ganz einfachen Tabelle nachgestellt und nur ein paar Datensaätze eingefügt (es reicht glaub eich einer). Die Transaktion dazu habe ich geschlossen. Tabelle löschen ist dann nicht möglich.

        Den Trigger selbst kann man löschen, jedoch bleiben die Verweise von diesem Trigger in der Tabelle RDB$CHECK_CONSTRAINTS drin.

        Comment


        • #5
          Welche Firebird-Architektur verwendest du?
          Thomas Steinmaurer

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

          Comment


          • #6
            super classic

            Comment


            • #7
              Ich hab mir jetzt deine anderen Meldungen nochmal näher durchgelesen. Zwei Dinge sind mir aufgefallen:

              - Warum machst du ein UPDATE im AFTER INSERT Trigger auf ein und die selbe Tabelle? Wenn du Feldwerte in einem Trigger setzen möchtest, dann nimm einen BEFORE INSERT/UPDATE Trigger her in Kombination mit der NEW.<column> Kontextvariable

              - Die von dir erwähnte RDB$CHECK_CONSTRAINTS Systemtabelle hat nichts mit deinen Triggers zu tun. Dort sind benutzerdefinierte CHECK Constraints hinterlegt, die im Hintergrund wiederum einen System-Trigger verwenden.

              Thomas
              Thomas Steinmaurer

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

              Comment


              • #8
                Das sind Transaktionseinträge. Es kommen in der Regel so ca. 9 Einträge die über eine Sequencenummer zusammen gehören. Die Sequencenummer kann aber mehrfach vorkommen im laufe der Zeit daher wird nur nach dieser Nummer in den letzen Minuten geschaut. Da in den letzten Transaktionen erst alle nötigen Informationen vorhanden sind werden die bereits vorhandenen Einträge in der Datenbank nach einem Insert alle auf den gleiche Stand gebracht.


                Sorry mit der Tabelle da hast du natürlich recht. Ich meinte die RDB$DEPENDENCIES.

                Comment


                • #9
                  Ja, da dürfte es irgendwo ein Problem geben. Auch wenn man den Trigger so abändert, dass der "eigene" Datensatz des Triggers durch das Update nicht betroffen ist (ID <> NEW.ID).

                  Ob dieses Verhalten "as designed" ist oder ein Bug, müßte man in firebird-support bzw. firebird-devel abklären.
                  Thomas Steinmaurer

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

                  Comment


                  • #10
                    Die Erweiterung (ID <> NEW.ID) macht natürlich Sinn, da habe ich nicht dran gedacht. Danke für den Tipp, werrde ich aufnehmen.

                    Nun gut, dann scheint es ja wirklich ein Bug zu sein, habe ich schon vermutet.

                    Comment


                    • #11
                      Nun gut, dann scheint es ja wirklich ein Bug zu sein, habe ich schon vermutet.
                      Das sollte dann abgeklärt bzw. in firebird-support bzw. firebird-devel bekannt gemacht werden. Einen einfachen Testfall hast ja schon. ;-)
                      Thomas Steinmaurer

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

                      Comment


                      • #12
                        Werde ich wohl machen müssen, aber mein Englisch ist nicht so prall :-(

                        Comment


                        • #13
                          Soll ich das für dich übernehmen?

                          Habe im Tracker auch gesehen, dass es ein paar Einträge zu ähnlichen Problemen gibt, d.h. vielleicht schon bekannt, aber halt etwas anders formuliert.
                          Thomas Steinmaurer

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

                          Comment


                          • #14
                            Originally posted by Thomas Steinmaurer View Post
                            Soll ich das für dich übernehmen?

                            Habe im Tracker auch gesehen, dass es ein paar Einträge zu ähnlichen Problemen gibt, d.h. vielleicht schon bekannt, aber halt etwas anders formuliert.
                            Das wäre natürlich klasse, wäre gut wenn du den eintrag dann verlinken könntest.

                            Comment

                            Working...
                            X