powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0 сломалось каскадное удаление
25 сообщений из 30, страница 1 из 2
Firebird 3.0 сломалось каскадное удаление
    #39283619
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммем DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
/******************************************************************************/
/***          Generated by IBExpert 2016.6.22.1 01.08.2016 9:58:18          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE DATABASE 'TEST.FDB '
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;



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



CREATE TABLE "TABLE_A" (
    "ID"         INTEGER NOT NULL,
    "SOME_DATA"  INTEGER
);


CREATE TABLE "TABLE_B" (
    "ID"          INTEGER NOT NULL,
    "TABLE_A_ID"  INTEGER,
    "SOME_DATA"   SMALLINT,
    "PARENT_ID"  SMALLINT
);


INSERT INTO "TABLE_A" ("ID", "SOME_DATA") VALUES (1, 10);

COMMIT WORK;

INSERT INTO "TABLE_B" ("ID", "TABLE_A_ID", "SOME_DATA", "PARENT_ID") VALUES (1, 1, 555, NULL);
INSERT INTO "TABLE_B" ("ID", "TABLE_A_ID", "SOME_DATA", "PARENT_ID") VALUES (2, 1, 222, 1);

COMMIT WORK;



/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE "TABLE_A" ADD CONSTRAINT "PK_TABLE_A" PRIMARY KEY ("ID");
ALTER TABLE "TABLE_B" ADD CONSTRAINT "PK_TABLE_B" PRIMARY KEY ("ID");


/******************************************************************************/
/***                              Foreign keys                              ***/
/******************************************************************************/

ALTER TABLE "TABLE_B" ADD CONSTRAINT "FK_TABLE_B_1" FOREIGN KEY ("TABLE_A_ID") REFERENCES "TABLE_A" ("ID") ON DELETE CASCADE;
ALTER TABLE "TABLE_B" ADD CONSTRAINT "FK_TABLE_B_2" FOREIGN KEY ("PARENT_ID") REFERENCES "TABLE_B" ("ID") ON DELETE CASCADE;



При попытке удаления
Код: sql
1.
DELETE FROM TABLE_A WHERE (ID = 1)



получаю
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.
At trigger 'CHECK_1'.

в Firebird 2.5.2 это работало!

Это баг fb 3.0 или баг был в fb 2.5 и это не должно работать?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283628
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frees,

почему parent_id smallint, а id - integer?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283631
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, случайность, не доглядел, проверил с integer проблема таже
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283634
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема, насколько я понимаю, только с self-referenced FK.
Возникла из-за введения стабильного курсора и особенностей реализации каскадных трггеров (мягко говоря, не очень стандартной).
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283636
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladПроблема, насколько я понимаю, только с self-referenced FK.
Странно, у меня деревья шлепаются с корня и до бесконечности (преувеличиваю, но по факту ограничений на вложения нет) без проблем.
Или у меня руки кривые и что-то сделал не так?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283637
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

и ты каскадное удаление на них используешь?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283639
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, чтоб повторить, записи в дереве по каскаду должны удалятся и причем и корень и ветка
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283640
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениси ты каскадное удаление на них используешь?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
/******************************************************************************/
/***                Generated by IBExpert 01.08.2016 9:43:04                ***/
/******************************************************************************/

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



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


CREATE GENERATOR GEN_GLOBAL_ID;

CREATE TABLE OBJECT (
    ID             ID NOT NULL /* ID = BIGINT NOT NULL */,
    PID            PID /* PID = BIGINT */,
    NAME           NAME /* NAME = VARCHAR(128) NOT NULL */,
    NOTE           NOTE /* NOTE = VARCHAR(512) */,
    OBJECTTYPE_ID  ID DEFAULT 0 /* ID = BIGINT NOT NULL */,
    BEGIN_DATE     DDATEDEF /* DDATEDEF = DATE DEFAULT CURRENT_DATE NOT NULL */,
    END_DATE       DDATENULL /* DDATENULL = DATE */,
    SP_END_DATE    DDATE /* DDATE = DATE NOT NULL */
);




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE OBJECT ADD CONSTRAINT PK_OBJECT PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign keys                              ***/
/******************************************************************************/

ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECT FOREIGN KEY (ID) REFERENCES OBJECT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECTTYPE FOREIGN KEY (OBJECTTYPE_ID) REFERENCES OBJECTTYPE (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;


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

CREATE INDEX OBJECT_IDX_DATE ON OBJECT (BEGIN_DATE, SP_END_DATE);


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



SET TERM ^ ;



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



/* Trigger: OBJECT_ADD_PARAMS */
CREATE OR ALTER TRIGGER OBJECT_ADD_PARAMS FOR OBJECT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
    execute procedure add_required_params(new.id, current_date);
end
^


/* Trigger: OBJECT_BI */
CREATE OR ALTER TRIGGER OBJECT_BI FOR OBJECT
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_global_id,1);
end
^


/* Trigger: OBJECT_BIU9 */
CREATE OR ALTER TRIGGER OBJECT_BIU9 FOR OBJECT
ACTIVE BEFORE INSERT OR UPDATE POSITION 9
AS
begin
    if ((new.id is not null) and (new.id = new.pid)) then
        exception except_id_pid;
    new.sp_end_date = coalesce(new.end_date, cast('01.01.3000' as date));
end
^

SET TERM ; ^

...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283641
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freesчтоб повторить, записи в дереве по каскаду должны удалятся и причем и корень и ветка
В дереве один корень и он удаляется без проблем захватив с собой всю структуру.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283643
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у тебя другая структура, в твоем примере, удялять не из OBJECT а из OBJECTTYPE надо и cascade на удалении из OBJECTTYPE нужен
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283644
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Код: sql
1.
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECT FOREIGN KEY (ID) REFERENCES OBJECT (ID) ON DELETE CASCADE ON UPDATE CASCADE;



И где тут дерево? Первичный ключ указывает сам на себя... Как так?
Похоже скопировал что-то не так.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283645
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freesу тебя другая структура
Ок.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283646
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИ где тут дерево?
То же не проснулся? :)
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283647
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисКак так?
О... Забавно, спасибо.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283648
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladПроблема, насколько я понимаю, только с self-referenced FK.
Возникла из-за введения стабильного курсора и особенностей реализации каскадных трггеров (мягко говоря, не очень стандартной).

Это баг или фича? как лучше исправить, удалить self-referenced FK ?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283650
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

мне действительно интересно. Если скрипт правильный, то как это вообще может работать?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283651
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frees,

убрать каскад на self-referenced FK. Сам FK тут не виноват
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283652
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Код: sql
1.
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECTTYPE FOREIGN KEY (OBJECTTYPE_ID) REFERENCES OBJECTTYPE (ID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;

Тут нет каскадного удаления.

Я ещё не исследовал подробно что там и как сломалось, поэтому могу быть где-то не совсем точен.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283655
Frees
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисFrees,

убрать каскад на self-referenced FK. Сам FK тут не виноват

А если каскад по self-referenced FK тоже нужен?
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283656
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeshvladПроблема, насколько я понимаю, только с self-referenced FK.
Возникла из-за введения стабильного курсора и особенностей реализации каскадных трггеров (мягко говоря, не очень стандартной).

Это баг или фича? как лучше исправить, удалить self-referenced FK ?Формально - баг. Как обойти - пока не вникал.
Повторю - я ещё не исследовал проблему подробно, так что не верьте мне на слово :)
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283657
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЕсли скрипт правильный, то как это вообще может работать?
Потому что
wadmanу меня руки кривые
Кривые очень профессионально.

Дерево выбирается с корня, а корнем считается тот, у кого родитель null.
Соответственно для пользователя все выглядит красиво, а в базе остается куча хвостов...
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283659
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

судя по всему должно быть так?

Код: sql
1.
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECT FOREIGN KEY (PID) REFERENCES OBJECT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283665
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениссудя по всему должно быть так?
Верно. Поправил и все равно нормально удаляется.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283672
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

у него случай другой. Каскады конфликтуют кто будет запись удалять.
...
Рейтинг: 0 / 0
Firebird 3.0 сломалось каскадное удаление
    #39283710
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freesу тебя другая структура, в твоем примере, удялять не из OBJECT а из OBJECTTYPE надо и cascade на удалении из OBJECTTYPE нужен
Сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE GENERATOR GEN_GLOBAL_ID;

CREATE TABLE OBJECT (
    ID             ID NOT NULL /* ID = BIGINT NOT NULL */,
    PID            PID /* PID = BIGINT */,
    NAME           NAME /* NAME = VARCHAR(128) NOT NULL */,
    NOTE           NOTE /* NOTE = VARCHAR(512) */,
    OBJECTTYPE_ID  ID DEFAULT 0 /* ID = BIGINT NOT NULL */,
    BEGIN_DATE     DDATEDEF /* DDATEDEF = DATE DEFAULT CURRENT_DATE NOT NULL */,
    END_DATE       DDATENULL /* DDATENULL = DATE */,
    SP_END_DATE    DDATE /* DDATE = DATE NOT NULL */
);




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE OBJECT ADD CONSTRAINT PK_OBJECT PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign keys                              ***/
/******************************************************************************/

ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECT FOREIGN KEY (PID) REFERENCES OBJECT (ID) ON DELETE CASCADE ON UPDATE CASCADE
  USING INDEX FK_OBJECT;
ALTER TABLE OBJECT ADD CONSTRAINT FK_OBJECT_OBJECTTYPE FOREIGN KEY (OBJECTTYPE_ID) REFERENCES OBJECTTYPE (ID) ON DELETE CASCADE ON UPDATE CASCADE;



Все равно удаляется нормально при удалении из objecttype.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0 сломалось каскадное удаление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]