Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0 сломалось каскадное удаление / 25 сообщений из 30, страница 1 из 2
01.08.2016, 08:30
    #39283619
Frees
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Иммем 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
01.08.2016, 09:15
    #39283628
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Frees,

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

и ты каскадное удаление на них используешь?
...
Рейтинг: 0 / 0
01.08.2016, 09:44
    #39283639
Frees
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
wadman, чтоб повторить, записи в дереве по каскаду должны удалятся и причем и корень и ветка
...
Рейтинг: 0 / 0
01.08.2016, 09:45
    #39283640
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Симонов Дениси ты каскадное удаление на них используешь?
Код: 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
01.08.2016, 09:46
    #39283641
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Freesчтоб повторить, записи в дереве по каскаду должны удалятся и причем и корень и ветка
В дереве один корень и он удаляется без проблем захватив с собой всю структуру.
...
Рейтинг: 0 / 0
01.08.2016, 09:49
    #39283643
Frees
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
у тебя другая структура, в твоем примере, удялять не из OBJECT а из OBJECTTYPE надо и cascade на удалении из OBJECTTYPE нужен
...
Рейтинг: 0 / 0
01.08.2016, 09:50
    #39283644
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
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
01.08.2016, 09:50
    #39283645
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Freesу тебя другая структура
Ок.
...
Рейтинг: 0 / 0
01.08.2016, 09:51
    #39283646
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Симонов ДенисИ где тут дерево?
То же не проснулся? :)
...
Рейтинг: 0 / 0
01.08.2016, 09:52
    #39283647
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Симонов ДенисКак так?
О... Забавно, спасибо.
...
Рейтинг: 0 / 0
01.08.2016, 09:54
    #39283648
Frees
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
hvladПроблема, насколько я понимаю, только с self-referenced FK.
Возникла из-за введения стабильного курсора и особенностей реализации каскадных трггеров (мягко говоря, не очень стандартной).

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

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

убрать каскад на self-referenced FK. Сам FK тут не виноват
...
Рейтинг: 0 / 0
01.08.2016, 09:57
    #39283652
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
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
01.08.2016, 09:59
    #39283655
Frees
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Симонов ДенисFrees,

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

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

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

Дерево выбирается с корня, а корнем считается тот, у кого родитель null.
Соответственно для пользователя все выглядит красиво, а в базе остается куча хвостов...
...
Рейтинг: 0 / 0
01.08.2016, 10:03
    #39283659
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
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
01.08.2016, 10:09
    #39283665
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
Симонов Дениссудя по всему должно быть так?
Верно. Поправил и все равно нормально удаляется.
...
Рейтинг: 0 / 0
01.08.2016, 10:17
    #39283672
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
wadman,

у него случай другой. Каскады конфликтуют кто будет запись удалять.
...
Рейтинг: 0 / 0
01.08.2016, 11:12
    #39283710
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 3.0 сломалось каскадное удаление
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 3.0 сломалось каскадное удаление / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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