SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Глюки Firebird4 ? (Firebird 2 и 4 работают по разному)
Глюки Firebird4 ? [сообщение #611] Tue, 20 September 2022 16:47 Переход к предыдущему сообщению
anbsoft в настоящее время не в онлайне  anbsoft
Сообщений: 4
Зарегистрирован: September 2022
Junior Member
Давно работал с Firebird 2.0
Решил попробовать перейти на новую версию (4).
Некоторые триггеры стали работать некорректно.
Примерно понимаю почему так, но пока не знаю что с этим делать.
Привожу код тестовой базы:
В таблице клиентов ведется долг клиента.
В таблице затрат проходят затраты по нему.
Некоторые затраты могут проходить пакетом (При проведении родительской затраты, автоматически проводятся дочернии).
Вставляем список затрат и подтверждаем их переводом State в 1
Поля Info и Test1 добавлены для понимания того, что происходит.

CREATE DATABASE 'Base2.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

CREATE TABLE Klient
(
ID Integer NOT NULL,
Name VarChar(50),
Dolg NUMERIC(15,2) DEFAULT 0,
PRIMARY KEY (ID)
);

CREATE GENERATOR GEN_Klient;

SET TERM ^ ;
CREATE TRIGGER SET_Klient FOR Klient
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable IDTemp Integer;
BEGIN
IF ((NEW.ID=0) OR (NEW.ID IS NULL)) THEN BEGIN
NEW.ID=GEN_ID(GEN_Klient,1);
END
END^
SET TERM ; ^

INSERT INTO Klient (ID, Name, Dolg) VALUES (0,'Test', 0);

CREATE TABLE Zatrat
(
ID Integer NOT NULL,
Parent Integer default 0,
IDKlient Integer,
State Integer default 0,
Suma NUMERIC(15,2) DEFAULT 0,
Info VarChar(100),
Test1 Integer,
PRIMARY KEY (ID)
);

CREATE GENERATOR GEN_Zatrat;
CREATE GENERATOR GEN_Test;


SET TERM ^ ;
CREATE TRIGGER SET_Zatrat FOR Zatrat
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF ((NEW.ID=0) OR (NEW.ID IS NULL)) THEN BEGIN
NEW.ID=GEN_ID(GEN_Klient,1);
END
END^

CREATE TRIGGER Edit_Zatrat FOR Zatrat
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable S1 VarChar(20);
declare variable S2 VarChar(20);
BEGIN
IF ((OLD.State<>1) AND (NEW.State=1)) THEN BEGIN
select Dolg from klient where (ID=NEW.IDKlient) into :S1;
UPDATE Klient SET Dolg=Dolg-OLD.Suma WHERE (ID=NEW.IDKlient);
select Dolg from klient where (ID=NEW.IDKlient) into :S2;
NEW.Info=' - ' || coalesce(OLD.Info, '') || ' ' || S1 || ' ' || S2;
NEW.Test1=GEN_ID(GEN_Test,1);
END
IF ((OLD.State=1) AND (NEW.State<>1)) THEN BEGIN
UPDATE Klient SET Dolg=Dolg+OLD.Suma WHERE (ID=NEW.IDKlient);
END
END^

CREATE TRIGGER Edit_Doc FOR Zatrat
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
IF ((NEW.Parent<>0) AND (NEW.State<>OLD.State)) THEN BEGIN
UPDATE Zatrat SET State=NEW.State WHERE (Parent=NEW.Parent) AND (State<>NEW.State) AND (ID<>NEW.ID);
END
END^

SET TERM ; ^

INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (1,1,1,0,10);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (2,1,1,0,30);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (3,1,1,0,50);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (4,1,1,0,200);

UPDATE Zatrat SET State=1 where (ID=1);

SELECT * FROM Klient;

ID NAME DOLG
== ======== ========
1 Test -290.00

Select * FROM Zatrat ORDER BY ID;

ID PARENT IDKLIENT STATE SUMA INFO TEST1
== ====== ======== ===== ====== =================== =====
1 1 1 1 10.00 - 0.00 -10.00 1
2 1 1 1 30.00 - -10.00 -40.00 2
3 1 1 1 50.00 - -40.00 -90.00 3
4 1 1 1 200.00 - -90.00 -290.00 4

COMMIT WORK;

В Firebird 4 результаты совсем друние:

SELECT * FROM Klient;

ID NAME DOLG
== ======== ========
1 Test -740.00

Select * FROM Zatrat ORDER BY ID;

ID PARENT IDKLIENT STATE SUMA INFO TEST1
== ====== ======== ===== ====== =================== =====
1 1 1 1 10.00 - 0.00 -10.00 1
2 1 1 1 30.00 - -10.00 -40.00 2
3 1 1 1 50.00 - -490.00 -540.00 6
4 1 1 1 200.00 - -540.00 -740.00 7

Видно, что между обновлением 2 и 3 строки еще трижды проходит обновление, но никаких следов не оставляет.
Как побороть эту напасть?
 
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Предыдущая тема: BIN_AND() в Firebird 4.0?
Следующая тема: fb3.0 -> 2.5: found 11.2, support 12.2.
Переход к форуму:
  


Текущее время: Thu Dec 19 15:53:50 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01061 секунд