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 ; ^
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 ; ^
Comment