powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер и внешний ключ
18 сообщений из 18, страница 1 из 1
Триггер и внешний ключ
    #40015108
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird 3.0

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

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

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


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

Однозначно.

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

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

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

+ много
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггер и внешний ключ
    #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
Триггер и внешний ключ
    #40015384
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Сложная логика на триггерах - зло. Бизнес-логика на триггерах - зло в квадрате.

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

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



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



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


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

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

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

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

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

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


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