Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер и внешний ключ / 18 сообщений из 18, страница 1 из 1
03.11.2020, 23:58
    #40015108
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Firebird 3.0

На одной таблице есть триггер BEFORE DELETE, на второй - внешний ключ, ссылающийся на поле первой таблицы ON DELETE CASCADE.

Вопрос: при удалении записи из первой таблицы, что сработает раньше - триггер или удаление записи из второй таблицы?..
...
Рейтинг: 0 / 0
04.11.2020, 00:48
    #40015115
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
alekcvp,

Каскад.
...
Рейтинг: 0 / 0
04.11.2020, 12:39
    #40015188
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Конечно, триггер. Мишка шутит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.11.2020, 13:06
    #40015191
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Гаджимурадов Рустам
Конечно, триггер. Мишка шутит.


Он может ошибаться по склерозу насчёт триггера, конечно, но при каскаде сначала выполняются удаления в ссылающихся на эту запись таблицах, это точно. Срабатывание BD триггера в этой таблице логично тоже ожидать после отработки каскада, но чем чёрт не шутит.
...
Рейтинг: 0 / 0
04.11.2020, 13:11
    #40015192
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
СПМ> Он может ошибаться по склерозу насчёт триггера, конечно

Однозначно.

СПМ> Срабатывание BD триггера в этой таблице логично
СПМ> тоже ожидать после отработки каскада

А как, по этой логике, ты бы триггером запрещал удаление?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.11.2020, 13:30
    #40015193
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
alekcvp
На одной таблице есть триггер BEFORE DELETE, на второй - внешний ключ, ссылающийся на поле первой таблицы ON DELETE CASCADE.

Вопрос: при удалении записи из первой таблицы, что сработает раньше - триггер или удаление записи из второй таблицы?..
1. Каскадные обновления реализованы системными триггерами, их не трудно найти в системных таблицах и понять порядок срабатывания.
2. Если возникают подобные вопросы - время задуматься об правильности своего решения.
Сложная логика на триггерах - зло. Бизнес-логика на триггерах - зло в квадрате.
...
Рейтинг: 0 / 0
04.11.2020, 13:31
    #40015194
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Сначала before trigger, потом запись реально удаляется, потом срабатывает каскад и before
trigger подчинённой таблицы, потом удаляются записи этой таблицы, потом after trigger этой
таблицы и в конце after trigger мастера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.11.2020, 15:09
    #40015225
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
hvlad> Сложная логика на триггерах - зло.
hvlad> Бизнес-логика на триггерах - зло в квадрате.

+ много
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.11.2020, 16:01
    #40015236
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Dimitry Sibiryakov

Сначала before trigger, потом запись реально удаляется, потом срабатывает каскад и before
trigger подчинённой таблицы, потом удаляются записи этой таблицы, потом after trigger этой
таблицы и в конце after trigger мастера.


Блин. Я же отчётливо помню холивары на эту тему. Не поленился проверить. Получилось ещё чудестраньше. Это полуторка, если что. В момент выполнения делета в случае каскада просто кладётся с прибором на ссылочную целостность. Один из китов, на которых стоит моё мировоззрение, потонул.

Код: plsql
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.
CREATE TABLE TESTDELLOG (
    TRG  CHAR(2),
    ID   INTEGER
)

Create Generator TestGen


CREATE TABLE TESTDELMASTER (
    ID  INTEGER NOT NULL,
    Constraint TDM_PK Primary Key (ID)
)

CREATE TRIGGER TDM_BD FOR TESTDELMASTER BEFORE DELETE
as
begin Insert Into testdellog (id, trg) Values (gen_id(testdel,1),'MB');
end

CREATE TRIGGER TDM_AD FOR TESTDELMASTER AFTER DELETE
as
begin Insert Into testdellog (id, TRG) Values (gen_id(testdel,1), 'MA');
end


CREATE TABLE TESTDELDETAIL (
    ID  INTEGER NOT NULL,
    Constraint TDD_FK Foregn Key (ID) References TestDelMaster (ID) On Delete Cascade
);

CREATE TRIGGER TDD_BD FOR TESTDELDETAIL BEFORE DELETE
as
begin Insert Into testdellog (id, TRG) Values (gen_id(testdel,1), 'DB');
end

CREATE TRIGGER TDD_AD FOR TESTDELDETAIL AFTER DELETE
as
begin Insert Into testdellog (id,TRG) Values (gen_id(testdel,1),'DA');
end

Insert into TestDelMaster (id) values (1)
Insert into TestDelDetail (id) values (1)
Insert into TestDelDetail (id) values (1)

Delete from TestDelMaster

Select from TestDelLog order by (ID)

TRG	ID
MB	1
MA	2
DB	3
DA	4
DB	5
DA	6
...
Рейтинг: 0 / 0
05.11.2020, 01:25
    #40015384
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
hvlad
Сложная логика на триггерах - зло. Бизнес-логика на триггерах - зло в квадрате.

Ну я бы не сказал что у меня что-то сложное. Есть таблица с древовидной структурой, при создании или удалении записи обновляется некое поле родительской записи. Я просто хотел при удалении записи сделать флаг, который бы отключал вычисление этих значений для зависимых записей, которые тоже удаляются.
...
Рейтинг: 0 / 0
05.11.2020, 11:17
    #40015477
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
alekcvp> Я просто хотел при удалении записи сделать флаг,
alekcvp> который бы отключал вычисление этих значений
alekcvp> для зависимых записей, которые тоже удаляются.

Сделай это (проставление флага и удаление) в ХП, которую и вызывай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2020, 15:22
    #40015580
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Ёкарный бабай. Я вспомнил. Во сне. И даже вспомнил почему так - чтобы не могли навтыкать новых ссылок пока удаляются старые..
...
Рейтинг: 0 / 0
05.11.2020, 15:36
    #40015583
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
СПМ> Ёкарный бабай. Я вспомнил. Во сне.



А вот был бы помоложе - бабы снились бы, а не всякая фигня.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2020, 17:17
    #40015627
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Гаджимурадов Рустам
СПМ> Ёкарный бабай. Я вспомнил. Во сне.



А вот был бы помоложе - бабы снились бы, а не всякая фигня.


Шёпотом, пока жена на кухне - знаешь, бабы тоже случаются
...
Рейтинг: 0 / 0
05.11.2020, 17:34
    #40015635
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Гаджимурадов Рустам

Сделай это (проставление флага и удаление) в ХП, которую и вызывай.

Не, я просто убрал ключ и сделал удаление в том же триггере. Чтобы если вдруг руками удалить что-то потребуется - не заморачиваться что там вызывать надо.
...
Рейтинг: 0 / 0
05.11.2020, 17:39
    #40015640
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
05.11.2020 17:34, alekcvp пишет:
> Не, я просто убрал ключ

а вот это ты зря.
каскады убрать, это да.
но ключ не смей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2020, 18:04
    #40015655
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
Мимопроходящий

05.11.2020 17:34, alekcvp пишет:
> Не, я просто убрал ключ
а вот это ты зря.
каскады убрать, это да.
но ключ не смей.

Почему?.. Ключ на ту же таблицу.
...
Рейтинг: 0 / 0
05.11.2020, 20:19
    #40015721
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер и внешний ключ
alekcvp
Почему?.. Ключ на ту же таблицу.
Потому что ключ гарантирует ссылочную целостность, а триггеры - нет.
Ключ оставь, каскады убери, а триггер ты уже переписал.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер и внешний ключ / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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