Ссылочная целостность
Ссылочная целостность
Как лучше поддерживать ссылочную целостность?
С помощью FK или все-таки триггеры?
FireBird 1.5 Final
С помощью FK или все-таки триггеры?
FireBird 1.5 Final
Re: Ссылочная целостность
Думаю надо искать золотую середину. Я использую FK с условием http://www.ibase.ru/devinfo/dontdoit.htm пункт 9.jbond писал(а):Как лучше поддерживать ссылочную целостность?
С помощью FK или все-таки триггеры?
FireBird 1.5 Final
Re: Ссылочная целостность
На триггерах невозможно гарантировать целостность т.к. FK работают вне транзакций а триггера - в транзакции.
Re: Ссылочная целостность
Что за чушь! И на сколько мне помнится FK реализован как системный триггер!Anonymous писал(а):На триггерах невозможно гарантировать целостность т.к. FK работают вне транзакций а триггера - в транзакции.
Вне механизма транзакций существуют только генераторы!
вы сами чушь-то поменьше пишите. FK контролирует ссылочную целостность, так? Каким образом? Посредством индекса. Индексы всегда "видят" все ключи для всех версий записей, независимо от транзакций. Поэтому целостность на FK, PK и Unique внетранзакционная (и это нормально).
Если же реализовать ссылочную целостность на триггерах, то можно спокойно
1. в одной транзакции изменить код у записи справочника
2. во второй транзакции сослаться на этот код для другой таблицы
3. сделать commit первой и второй транзакции, и получить что?
правильно, во второй таблице ссылку на НЕСУЩЕСТВУЮЩИЙ код справочника.
А FK, поскольку "видит" изменения вне транзакций, не даст это сделать т.к. увидит, что код справочника поменялся. или не даст его поменять, и т.п.
Точно также ПК - вставляем в справочник запись с кодом, параллельно из другой транзакции нам запись с таким же кодом вставить не дадут. Почему? Потому что уникальный индекс по ПК видит все изменения (не committed) и не даст создать дубликат ключа.
А "системные триггеры" по FK делаются только на каскадных update/delete, и опять же, они действуют тоже вне транзакций.
Вы что думаете, что если сервер дает возможность работать с транзакциями, то сам он дурак, и для специфических операций тоже будет сам только транзакциями пользоваться?
Если же реализовать ссылочную целостность на триггерах, то можно спокойно
1. в одной транзакции изменить код у записи справочника
2. во второй транзакции сослаться на этот код для другой таблицы
3. сделать commit первой и второй транзакции, и получить что?
правильно, во второй таблице ссылку на НЕСУЩЕСТВУЮЩИЙ код справочника.
А FK, поскольку "видит" изменения вне транзакций, не даст это сделать т.к. увидит, что код справочника поменялся. или не даст его поменять, и т.п.
Точно также ПК - вставляем в справочник запись с кодом, параллельно из другой транзакции нам запись с таким же кодом вставить не дадут. Почему? Потому что уникальный индекс по ПК видит все изменения (не committed) и не даст создать дубликат ключа.
А "системные триггеры" по FK делаются только на каскадных update/delete, и опять же, они действуют тоже вне транзакций.
Вы что думаете, что если сервер дает возможность работать с транзакциями, то сам он дурак, и для специфических операций тоже будет сам только транзакциями пользоваться?
