powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
53 сообщений из 53, показаны все 3 страниц
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580531
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

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.
recreate table tdetlA(id int primary key , pid int); commit;
commit;
recreate table tmain(id int primary key);
commit;
alter table tdetlA add constraint tdetl_fk
    foreign key (pid)
    references tmain(id)
    on delete cascade;
commit;

recreate table taud(
    id int primary key,
    dts timestamp default 'now',
    trg_name varchar(20),
    tmain_cnt int,
    tdetl_cnt int,
    msg varchar(30)
    );
commit;

recreate sequence g; commit;
recreate sequence ga; commit;

insert into tmain values(1);
insert into tdetlA select gen_id(g,1), 1 from rdb$types rows 5;
commit;

---------------------
set term ^;
create or alter trigger tdetla_bd for tdetlA active before delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_Before_delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );

end^

create or alter trigger tdetla_ad for tdetlA active after delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_After__delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );
end^
set term ;^
commit;

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> set width trg_name 20; set width msg 20;
SQL> commit; set transaction read committed record_version;
SQL> delete from tmain;
SQL> select * from taud;

          ID                       DTS TRG_NAME                TMAIN_CNT    TDETL_CNT MSG
============ ========================= ==================== ============ ============ ===============
           1 2014-03-06 19:37:45.5100  tdetla_Before_delete            0            5 deleted id = 1
           2 2014-03-06 19:37:45.5110  tdetla_After__delete            0            4 deleted id = 1
           3 2014-03-06 19:37:45.5110  tdetla_Before_delete            0            4 deleted id = 2
           4 2014-03-06 19:37:45.5110  tdetla_After__delete            0            3 deleted id = 2
           5 2014-03-06 19:37:45.5110  tdetla_Before_delete            0            3 deleted id = 3
           6 2014-03-06 19:37:45.5110  tdetla_After__delete            0            2 deleted id = 3
           7 2014-03-06 19:37:45.5110  tdetla_Before_delete            0            2 deleted id = 4
           8 2014-03-06 19:37:45.5110  tdetla_After__delete            0            1 deleted id = 4
           9 2014-03-06 19:37:45.5110  tdetla_Before_delete            0            1 deleted id = 5
          10 2014-03-06 19:37:45.5110  tdetla_After__delete            0            0 deleted id = 5

Содержимое столба T DETL _CNT мну понятно.
Не въезжаю, однако, что мешает триггерам (обоим, и before и after) видеть master-запись ?
Менять её они не должны, видимо, но почему нельзя её ЧИТАТЬ, ведь стейтмент еще не завершен.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНе въезжаю, однако, что мешает триггерам (обоим, и before и after) видеть
master-запись ?
То, что она к этому моменту уже удалена. Так работают каскады.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580547
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил в триггеры before & after delete также на таблицу t Main :
Код: 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.
set term ^;
execute block as
begin
  begin
      execute statement 'drop trigger tdetla_ad';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tdetla_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_ad';
      when any do begin end
  end
end^
set term ;^
commit;

recreate table tdetlA(id int primary key , pid int); commit;
commit;
recreate table tmain(id int primary key);
commit;
alter table tdetlA add constraint tdetl_fk
    foreign key (pid)
    references tmain(id)
    on delete cascade;
commit;

recreate table taud(
    id int primary key,
    dts timestamp default 'now',
    trg_name varchar(20),
    tmain_cnt int,
    tdetl_cnt int,
    msg varchar(30)
    );
commit;

recreate sequence g; commit;
recreate sequence ga; commit;

insert into tmain values(1);
insert into tdetlA select gen_id(g,1), 1 from rdb$types rows 5;
commit;


---------------------
set term ^;
create or alter trigger tmain_bd for tmain active BEFORE delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tmain_Before_delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );
end^

create or alter trigger tmain_ad for tmain active AFTER delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tmain_After__delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );
end^

create or alter trigger tdetla_bd for tdetlA active before delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_Before_delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );
end^

create or alter trigger tdetla_ad for tdetlA active after delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_After__delete',
                (select count(*) from tmain),
                (select count(*) from tdetlA),
                'deleted id = '||old.id
              );
end^
set term ;^
commit;

Вышеприведенный тест показывает, что AFTER -триггер при удалении master -строки срабатывает *до* первого BEFORE -триггера, который срабатывает при удалении detail -строки, т.е. когда стейтмент еще НЕ завершен.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> set width trg_name 12; set width msg 20;
SQL> commit; set transaction read committed record_version;
SQL> delete from tmain; select * from taud;

          ID                       DTS TRG_NAME        TMAIN_CNT    TDETL_CNT MSG
============ ========================= ============ ============ ============ ===============
           1 2014-03-06 20:13:36.6270  tmain_Before            1            5 deleted id = 1
           2 2014-03-06 20:13:36.6270  t main _ After _            0            5 deleted id = 1
           3 2014-03-06 20:13:36.6270  tdetla_Befor            0            5 deleted id = 1
           4 2014-03-06 20:13:36.6270  tdetla_After            0            4 deleted id = 1
           5 2014-03-06 20:13:36.6280  tdetla_Befor            0            4 deleted id = 2
           6 2014-03-06 20:13:36.6280  tdetla_After            0            3 deleted id = 2
           7 2014-03-06 20:13:36.6280  tdetla_Befor            0            3 deleted id = 3
           8 2014-03-06 20:13:36.6280  tdetla_After            0            2 deleted id = 3
           9 2014-03-06 20:13:36.6280  tdetla_Befor            0            2 deleted id = 4
          10 2014-03-06 20:13:36.6280  tdetla_After            0            1 deleted id = 4
          11 2014-03-06 20:13:36.6280  tdetla_Befor            0            1 deleted id = 5
          12 2014-03-06 20:13:36.6280  tdetla_After            0            0 deleted id = 5
Вроде бы ДС(?) неоднократно говорил, что с порядком выполнения триггеров при наличии каскада нужно быть повнимательнее.
Вот я тепеь внимательно смотрю и тихо офигеваю :(
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580551
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТо, что она к этому моменту уже удалена. Так работают каскады.Как-то логичнее смотрелось бы
1) залочивание мастер-строки (от любых изменений)
2) срабатывание before-триггера в master-строке
3) проведение удалений подчиненных строк (и срабатывание before + after триггеров detail-таблицы)
4) срабатывание after-триггера в master-строке
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидКак-то логичнее смотрелось бы
1) залочивание мастер-строки (от любых изменений)
Вот физическое удаление и есть это залочивание. Мало того, что её после этого нельзя
изменить, так на неё ещё и сослаться невозможно, ЧиТД.

Насчёт пп. 3-4 я согласен. Но это, наверное, историческое поведение, так что менять не будут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580556
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидКак-то логичнее смотрелось быПоторопился, вот что на самом деле имелось в виду:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
1) залочивание мастер-строки (от любых изменений, но НЕ от чтения её!)
2) срабатывание before-триггера master-таблицы 
3) проведение удалений подчиненных строк:
3.1) срабатывание before-триггера на каждой удаляемой подчиненной строке; master-строка здесь еще доступна на чтение;
3.2) удаление подчиненной строки
3.3) срабатывание after-триггера после удаления каждой подчинённой строки; master-строка здесь еще доступна на чтение;
4) удаление master-строки - и вот только после этого удаления она становится не видимой в текущей транзакции;
5) срабатывание after-триггера master-таблицы (после удаления master-строки)
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580560
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидКак-то логичнее смотрелось бы
1) залочивание мастер-строки (от любых изменений)
Вот физическое удаление и есть это залочивание. Мало того, что её после этого нельзя
изменить, так на неё ещё и сослаться невозможно, ЧиТД.

Насчёт пп. 3-4 я согласен. Но это, наверное, историческое поведение, так что менять не будут.Залочивание для последующего удаления еще НЕ означает, что строку нельзя прочитать, пока это самое удаление не произойдёт.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580562
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЗалочивание для последующего удаления еще НЕ означает НЕ ДОЛЖНО ОЗНАЧАТЬ, что строку нельзя прочитать, пока это самое удаление не произойдёт.(поправел)
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580565
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0xFF. блин, а еще же в триггере деталь-таблицы при событии "deleting" ни хрена не узнать, КАКОЙ это delete был: каскадный, вызванный удалением родительской записи, или же "просто" грохнули одну строку детали... :'(
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580568
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

в каскадировании нет никаких наворотов, все делается системным триггером AFTER DELETE на мастере.

насчет твоего 0xFF - недавно (в трекере вроде) предлагалось ввести контекстную переменную CASCADING для этих целей.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580570
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоид,

в каскадировании нет никаких наворотов, все делается системным триггером AFTER DELETE на мастере.

насчет твоего 0xFF - недавно (в трекере вроде) предлагалось ввести контекстную переменную CASCADING для этих целей.а почему нельзя запускать каскад системным триггером BEFORE delete на мастер-таблице ?
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580571
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я лично бы был счастливее если бы у детейла при каскаде триггера вообще не срабатывали.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580572
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и самое главное: можно ли как-то подправить консерваторию, чтобы мастер-строка была видна в триггерах на событие delete деталь-таблицы (но чтобы её нельзя было менять, разумеется) - ?
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580573
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидпочему нельзя запускать каскад системным триггером *BEFORE *delete на
мастер-таблице ?
Для защиты от идиотов, которые бы норовили вставить в детейл новую запись, ссылающуюся на
удаляемого мастера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580577
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидпочему нельзя запускать каскад системным триггером *BEFORE *delete на
мастер-таблице ?Для защиты от идиотов, которые бы норовили вставить в детейл новую запись, ссылающуюся на удаляемого мастера.а, точно - ведь Влад же говорил про это... "в где-то"... не помню точно, может и тут.
Мда, грустно всё... :'(
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580578
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> насчет твоего 0xFF - недавно (в трекере вроде) предлагалось
dimitr> ввести контекстную переменную CASCADING для этих целей.

Это чтобы свои флаги/переменные не задавать? И что решили?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580579
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> Я лично бы был счастливее если бы у детейла
Dimitry Sibiryakov> при каскаде триггера вообще не срабатывали.

Да ты никак с дубу рухнул, Дим. Уж святое-то не трожь хотя бы...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580584
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЭто чтобы свои флаги/переменные не задавать? И что решили?
пока ничего, просто приняли к сведению. Вот тут это было.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580588
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамДа ты никак с дубу рухнул, Дим. Уж святое-то не трожь хотя бы...

А что, в мускуле они не срабатывают, например.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580589
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ссылку. А Шон там молодец, конструктивен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580590
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> А что, в мускуле они не срабатывают, например.

Возможно. Но не опускаться же на его уровень.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580594
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА что, в мускуле они не срабатывают, например.
они и тут на стандарт забили? Ай молодцы :-)
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580601
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrони и тут на стандарт забили?
А что, в стандарте есть триггера?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580602
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, выкрутился через автономную транзакцию: при событии "deleting" считываю в ней значения из master-записи в переменные (ибо она еще видна там, запись эта).
Через Жо как-то получилось... :-(
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580606
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov> А что, в стандарте есть триггера?

В 99-м есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580675
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ общем, выкрутился через автономную транзакцию: при событии "deleting" считываю в ней значения из master-записи в переменные (ибо она еще видна там, запись эта).
Через Жо как-то получилось... :-(Хорошая мысля приходит апосля (С).
Есть способ получше: в before delete триггере master-таблицы затолкать в context-переменные значения нужных полей, а затем читать их в триггере detail-таблицы. И разумеется, выбрасывать исключение, если хотя бы одной из таких переменных нет (т.е. триггер master-таблицы "внезапно" вырубили или убрали оттудова присваивания контекстам).
В итоге, нет нужды в автономной транзакции. А с учетом того, что в ФБ-3 rdb$get/set_context'ы будут (наверное...) выглядеть для движка не как "сторонние" UDF'ы, то и скорость будет ОК.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38580683
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Хорошая мысля приходит апосля (С).
Таблоид> Есть способ получше: в before delete триггере
Таблоид> master-таблицы затолкать в context-переменные

Во-первых, внимательнее надо быть, внимательнее: 15685419
Во-вторых, прежде чем выкручиваться и ждать запоздалых умных
мыслей ты бы задачу-то озвучил - тебе бы подсказали, как правильнее.
А-то выдумаешь, как обычно, хрень какую-нибудь и борешься с ней.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581188
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамвнимательнее: 15685419 я видел это сообщение. Но ведь это пока что только хотелка, и неизвестно, будет ли она вообще реализована.Гаджимурадов Рустамты бы задачу-то озвучилЗадача следующая.
Есть таблица заголовков складских документов (doc_list), и подчинённая к ней таблица со строками (doc_data), они связаны по FK + on delete cascade.
Таблица doc_list содержит поля dept_id и optype_id - ИДшники "департамента" и вида операции. Последний влияет на то, какие остатки в какую сторону должны меняться.

Есть также таблица остатков (агрегат), с детализацией до уровня dept_id.
Да, я знаю, что именно эта таблица будет узким местом при сильной конкуренции за одно и то же изделие. Но из-за констрейнтов qty_*** >= 0 применить схему бесконфликтного агрегирования "на вставках", которую тут показывал ДС, - не получится.
Есть, правда, одна идейка с контекстными переменными, но она может жить только при работе с базой исключительно SYSDBA или её владельца (т.к. нужно видеть ВСЕ записи mon$context_variables). От воплощения этой идеи пока воздерживаюсь :-)
Ну так вот: когда происходит удаление отдельной строки в таблице doc_data (НЕ каскадное), то надо вытряхнуть из заголовка документа (doc_list) значения dept_id & optype_id - чтобы далее скорректировать остатки. Это делается без проблем, т.к. при НЕкаскадном удалении строка doc_list'a - видна. А когда происходит такое же удаление, но вызванное КАСКАДОМ (т.е. грохнули вообще заголовок документа), то dept_id & optype_id становятс недоступными.
Вариант добавления этих полей в doc_data рассматривать совсем не хочется: денормализация только из-за отсутствия возможности глянуть в родит. таблицу при каскадном удалении - не айс как бэ.
Отсюда и вопрос топега возник.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581198
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВариант добавления этих полей в doc_data рассматривать совсем не хочется

А вариант убить каскад и делать его обычным триггером?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581207
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> глянуть в родит. таблицу при каскадном удалении - не айс как бэ.

Ну, что тут можно сказать.

1. Типичный пример, когда, пожалуй, ХП лучше триггеров.
2. У тебя нарушается принцип "триггеры не должны зависеть
и взаимодействовать друг с другом" - это чревато проблемами.
3. Вариант с контекстной переменной тоже не айс, ИМХО.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581250
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидВариант добавления этих полей в doc_data рассматривать совсем не хочетсяА вариант убить каскад и делать его обычным триггером?..Был такой порыв, признаться... Но почему-то думкал, что раз при удалении "от каскада" родительскяа запись становится не видной, но и при удалении, вызванном триггером родительской таблицы - тоже будет так.

Я ошибался: при отсутствии каскада порядок срабатывания триггеров уже вполне понятный, да и родительская запись остается видимой в before & after триггере дочерней таблицы.
Вот исллюстрация.

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.
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.
104.
105.
set term ^;
execute block as
begin
  begin
      execute statement 'drop trigger tdetla_ad';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tdetla_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_ad';
      when any do begin end
  end
end^
set term ;^
commit;

recreate table tdetlA(id int primary key , pid int); commit;
commit;
recreate table tmain(id int primary key);
commit;
alter table tdetlA add constraint tdetl_fk
    foreign key (pid)
    references tmain(id)
    --on delete cascade -- ВЫРУБАЕМ
    ;
commit;

recreate table taud(
    id int primary key,
    dts timestamp default 'now',
    trg_name varchar(20),
    tmain_cnt int,
    tdetl_cnt int,
    msg varchar(30)
    );
commit;

recreate sequence g; commit;
recreate sequence ga; commit;

insert into tmain values(1);
insert into tdetlA select row_number()over(), 1 from rdb$types rows 5;
commit;

---------------------
set term ^;
create or alter trigger tmain_bd for tmain active BEFORE delete as
  declare cnt bigint;
begin
    --in autonomous transaction do
    insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
    values( gen_id(ga,1),
            'tmain_Before_delete',
            (select count(*) from tmain m where m.id=old.id),
            (select count(*) from tdetlA d where d.pid=old.id),
            'deleted id = '||old.id
          );
    --select count(*) from rdb$types,rdb$types,rdb$types into cnt; -- об этом "замедлителе" - попозже.
    delete from tdetlA d where d.pid = old.id; -- no cascade
end^

create or alter trigger tmain_ad for tmain active AFTER delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tmain_After__delete',
                (select count(*) from tmain m where m.id=old.id),
                (select count(*) from tdetlA d where d.pid=old.id),
                'deleted id = '||old.id
              );
end^

create or alter trigger tdetla_bd for tdetlA active before delete as
begin
    --in autonomous transaction do
    insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
    values( gen_id(ga,1),
            'tdetla_Before_delete',
            (select count(*) from tmain m where m.id=old.pid ),
            (select count(*) from tdetlA d where d.pid=old.pid ),
            'deleted id = '||old.id
          );
end^

create or alter trigger tdetla_ad for tdetlA active after delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_After__delete',
                (select count(*) from tmain m where m.id=old.pid),
                (select count(*) from tdetlA d where d.pid=old.pid),
                'deleted id = '||old.id
              );
end^
set term ;^
commit;

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> set width trg_name 20; set width msg 20;
SQL> delete from tmain; select * from taud; rollback;

          ID                       DTS TRG_NAME                TMAIN_CNT    TDETL_CNT MSG
============ ========================= ==================== ============ ============ ===============
          13 2014-03-07 15:19:45.6720  tmain_ Before _delete             1            5 deleted id = 1
          14 2014-03-07 15:19:54.0110  tdetla_Before_delete            1            5 deleted id = 1
          15 2014-03-07 15:19:54.0110  tdetla_After__delete            1            4 deleted id = 1
          16 2014-03-07 15:19:54.0110  tdetla_Before_delete            1            4 deleted id = 2
          17 2014-03-07 15:19:54.0110  tdetla_After__delete            1            3 deleted id = 2
          18 2014-03-07 15:19:54.0110  tdetla_Before_delete            1            3 deleted id = 3
          19 2014-03-07 15:19:54.0110  tdetla_After__delete            1            2 deleted id = 3
          20 2014-03-07 15:19:54.0110  tdetla_Before_delete            1            2 deleted id = 4
          21 2014-03-07 15:19:54.0110  tdetla_After__delete            1            1 deleted id = 4
          22 2014-03-07 15:19:54.0110  tdetla_Before_delete            1            1 deleted id = 5
          23 2014-03-07 15:19:54.0110  tdetla_After__delete            1            0 deleted id = 5
          24 2014-03-07 15:19:54.0110  tmain_ After __delete             0            0 deleted id = 1
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581251
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам2. У тебя нарушается принцип "триггеры не должны зависеть
и взаимодействовать друг с другом" - это чревато проблемами.Согласен. Пришлось затолкать проверку наличия контекстов в дочерний триггер, да и еще в несколько мест.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581285
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВот исллюстрация.
Т.е. слова ДЕ "все делается системным триггером AFTER DELETE на мастере" до тебя не
дошли... Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581291
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще ту нарылось. К вопросу о том, зачем каскад сразу убивает родительскую запись, ДО срабатывания дочерних триггеров:Dimitry SibiryakovДля защиты от идиотов, которые бы норовили вставить в детейл новую запис ь, ссылающуюся на удаляемого мастера.

Я попробовал при в Ы ключенном каскаде следующее:

1) в before delete-триггере таблицы-детали добавил INSERT-команду, вставляющую запись в эту же деталь со ссылкой на удаляемого сейчас мастера (old.pid). Результат: поломать FK не получилось,
Код: plaintext
1.
2.
3.
4.
Statement failed, SQLSTATE = 23000
violation of FOREIGN KEY constraint "TDETL_FK" on table "TDETLA"
-Foreign key references are present for the record
-Problematic key value is ("ID" = 1)


2) добавил "замедлитель" в before delete триггер мастер-таблицы, в виде select count(*) кросса из около 15 млн записей.
Он даёт на моём железе паузу выполнения около 8 сек (вполне достаточную, чтобы переключиться в другое окно и сделать там какую-нибудь гадость):
Код: 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.
104.
105.
106.
107.
108.
set term ^;
execute block as
begin
  begin
      execute statement 'drop trigger tdetla_ad';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tdetla_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_bd';
      when any do begin end
  end
  begin
      execute statement 'drop trigger tmain_ad';
      when any do begin end
  end
end^
set term ;^
commit;

recreate table tdetlA(id int primary key , pid int); commit;
commit;
recreate table tmain(id int primary key);
commit;
alter table tdetlA add constraint tdetl_fk
    foreign key (pid)
    references tmain(id)
    --on delete cascade
    ;
commit;

recreate table taud(
    id int primary key,
    dts timestamp default 'now',
    trg_name varchar(20),
    tmain_cnt int,
    tdetl_cnt int,
    msg varchar(30)
    );
commit;

recreate sequence g; commit;
recreate sequence ga; commit;

insert into tmain values(1);
insert into tmain values(2);
insert into tdetlA select gen_id(ga,1), iif(row_number()over()<5, 1, 2) from rdb$types rows 10;
commit;

---------------------
set term ^;
create or alter trigger tmain_bd for tmain active BEFORE delete as
  declare cnt bigint;
begin
    --in autonomous transaction do
    insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
    values( gen_id(ga,1),
            'tmain_Before_delete',
            (select count(*) from tmain m where m.id=old.id),
            (select count(*) from tdetlA d where d.pid=old.id),
            'deleted id = '||old.id
          );
    select count(*) from rdb$types,rdb$types,rdb$types into cnt; -- ~8 sec
    delete from tdetlA d where d.pid = old.id; -- no cascade
end^

create or alter trigger tmain_ad for tmain active AFTER delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tmain_After__delete',
                (select count(*) from tmain m where m.id=old.id),
                (select count(*) from tdetlA d where d.pid=old.id),
                'deleted id = '||old.id
              );
end^

create or alter trigger tdetla_bd for tdetlA active before delete as
begin
    --in autonomous transaction do
    insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
    values( gen_id(ga,1),
            'tdetla_Before_delete',
            (select count(*) from tmain m where m.id=old.pid ),
            (select count(*) from tdetlA d where d.pid=old.pid ),
            'deleted id = '||old.id
          );

    --insert into tdetlA(id, pid) values(gen_id(ga,1), old.pid); -- не "помогло" :-)
end^

create or alter trigger tdetla_ad for tdetlA active after delete as
begin
    --in autonomous transaction do
        insert into taud(id, trg_name, tmain_cnt, tdetl_cnt, msg)
        values( gen_id(ga,1),
                'tdetla_After__delete',
                (select count(*) from tmain m where m.id=old.pid),
                (select count(*) from tdetlA d where d.pid=old.pid),
                'deleted id = '||old.id
              );
end^
set term ;^
commit;


И при этом делал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 session #1 
commit; set transaction read committed record_version no wait;
insert into tdetla select 100+id, 1 from tdetla; -- только ввёл, но еще НЕ нажал Enter!

 session #2 
commit; set transaction read committed record_version no wait;
delete from tmain; -- [ Enter ]

 session #1 
[Enter] - ввёл на выполнение insert into tdetla select 100+id, 1 from tdetla; 
Эта команда выполнилась без ошибок.
Далее сразу же: 
commit;

 session #2 
Примерно через 8 сек команда удаления из tmain также завершилась *БЕЗ* ошибок.
commit;

 session #1 
select * from tdetla

Результат: ПУСТО, ноль строк.

И поэтому - вопрос: может, опасения про то, что "идиоты могут вставить запись со ссылкой на удаляемого мастера", - преувеличены ?
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581296
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидВот исллюстрация.
Т.е. слова ДЕ "все делается системным триггером AFTER DELETE на мастере" до тебя не
дошли... Ню-ню...Эти слова я увидел уже после того, как извернулся с контекстами. Я не знал про сиё, ну а переделывать сейчас на схему без каскада" нет смысла, КМК.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581301
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Согласен. Пришлось

Вот именно это и есть неправильно и мина замедленного действия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581314
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВот именно это и есть неправильно и мина замедленного действия.Тогда остается вариант запроса полей родит. таблицы в автономной транзакции (стартующей в дочернем before-delete триггере), но это лишние затраты ресурсов сервера будут. Либо делать, как ДС сказал - без каскадов.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581324
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Тогда остается вариант

Нет, ещё есть вариант нормальной организации PSQL-блоков,
например, ХП, которая вызывается вручную или из триггера
родительской таблицы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581335
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамнапример, ХП, которая вызывается вручную или из триггера
родительской таблицы.Если код, обновляющий таблицу остатков, встречается только в одном месте (в триггере дочерней таблицы), то какая разница, где ему быть, этому коду: в триггере или в ХП ?
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581364
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большая разница, потому что если он будет в ХП, которая
вызывается из триггера родительской таблицы, то никаких
извратов с транзакциями, контекстными переменными и
удалением каскадов уже не нужно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581375
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамникаких извратов с транзакциями, контекстными переменными и
удалением каскадов уже не нужно.OK, буду думкать. Спасибо.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581383
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да о чём там думкать-то? Всё очевидно.
Но настаивать не буду, ты любишь извраты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581406
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у мну просьба будет к тебе и ДСу: когда черновик теста этого доделаю, то вышлю его DDL вам в мыло. Нужно будет знать твоё и его мнение, для начала - в привате. Если удастся в дальнейшем довести это всё до ума, то передам его в FB QA.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581409
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помочь я всегда готов, тем более если дело стоящее.
А тест чего именно - последовательности триггеров?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581416
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамПомочь я всегда готов, тем более если дело стоящее.
А тест чего именно - последовательности триггеров?Не, хочу большего: имитация OLTP-нагрузки мифического склада + что-то там из OLAP'a для бухов. Схема в голове давно уже сидит.
Года 4 взад я делал первую попытку, но мну она сейчас совсем не нравится.
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581417
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну попробуй. Но я сомневаюсь, что Павел это
примет - скорее всего, даже разбираться не станет.

Нужны другие тесты, совсем другие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581427
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНужны другие тесты, совсем другие.Про какие именно ты говоришь ?
(нагрузочные тоже нужны. Мне об этом русским по белому Ковязин сказал, еще год взад; да и тест на развал индексов тому подтверждение: приличное число "странностей" с его помощью было найдено, когда на базу наваливалось несколько сотен аттачей).
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581462
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Про какие именно ты говоришь ?

Более маленькие и простые, в т.ч. регрессионные.

Нагрузочные тоже нужны, конечно, кто ж спорит.
Никто не скажет "не нужно" бесплатному тесту,
тем более Ковязин. В т.ч. тест бэкапа, импорта,
создания индексов, в т.ч. сравнительные тесты.

В общем, это надо у Павла и Ко спрашивать - что
у них уже есть и что требуется в первую очередь.
Есть TPC тесты, в конце концов - не в чистом
виде, конечно, но идеи взять можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581489
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТаблоид> Про какие именно ты говоришь ?

Более маленькие и простые, в т.ч. регрессионные.Их есть у меня, но в разрозненном виде. И там надо создавать базу с соотв. данными и эталонными результатами, дабы затем натравливать скрипты, сравнивать результаты с эталонными и оповещать о проблемах. В общем, это всё пока только в мыслях и фантазиях.

Гаджимурадов РустамЕсть TPC тесты, в конце концов - не в чистом виде, конечно, но идеи взять можно.Вариант ТРС для ФБ, который я видел, не содержит фишек от трёшки. И в нём нет идеи бесконфликтного обновления сальдо контрагентов, которая мну покоя не даёт :-)
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581495
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> И там надо создавать базу с соотв. данными и эталонными результатами

Да, но можно делать не болванку БД, а "самонаполняющуюся" БД.

> Вариант ТРС для ФБ, который я видел, не содержит фишек от трёшки

Фишки трёшки (какие именно?) - это вообще десятый вопрос, ИМХО.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581503
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТаблоид> И там надо создавать базу с соотв. данными и эталонными результатами

Да, но можно делать не болванку БД, а "самонаполняющуюся" БД.Рандомные данные далеко не всегда позволяют выявить траблы. Речь идёт именно о "магии чисел", на которых запросы ФБ и <другой СУБД> могут выдавать разные результаты. Под "другой СУБД" имеется прежде всего m$ sql, т.к. запросы я на ФБ переделывал именно с его диалекта.

Гаджимурадов РустамФишки трёшки (какие именно?) - это вообще десятый вопрос, ИМХО.Оконные функции, hash join и скалярные функции ("PSQL Stored functions";они еще не допилены вроде).
Также в обозримом будущем вроде бы будут долгожданные улучшения в мониторинге, и их можно будет тоже "прощупать".
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581512
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид"PSQL Stored functions";они еще не допилены вроде
все там давно допилено
...
Рейтинг: 0 / 0
Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
    #38581830
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Рандомные данные далеко не всегда позволяют выявить траблы

Необязательно рандомные, можно и по алгоритму.
Можно и болванку иметь, в конце концов - будь-то
examples.fdb или QA.fdb (у Павла-то она точно есть,
можно расшарить её или вместе наполнять).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Каскадное удаление: почему триггер таблицы-детали НЕ видит мастер-записи ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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