Страница 1 из 1

Ссылочная целостность

Добавлено: 05 ноя 2004, 13:59
jbond
Как лучше поддерживать ссылочную целостность?
С помощью FK или все-таки триггеры?
FireBird 1.5 Final

Re: Ссылочная целостность

Добавлено: 05 ноя 2004, 14:49
kdv
jbond писал(а):Как лучше поддерживать ссылочную целостность?
С помощью FK или все-таки триггеры?
FireBird 1.5 Final
Думаю надо искать золотую середину. Я использую FK с условием http://www.ibase.ru/devinfo/dontdoit.htm пункт 9.

Добавлено: 08 ноя 2004, 15:36
Гость
То что можно сделать через FK - делаю через FK (те же триггеры, только системные). С чем не справляеться FK - на триггерах + ХП по необходимости. Просто FK все-таки удобнее по-моему, если их можно применить ес-но.

Re: Ссылочная целостность

Добавлено: 11 ноя 2004, 11:06
Гость
На триггерах невозможно гарантировать целостность т.к. FK работают вне транзакций а триггера - в транзакции.

Добавлено: 11 ноя 2004, 19:40
Vemer
Интересно, как можно внести изменения в базу вне контекста транзакций? Или я что-то не понял?

Re: Ссылочная целостность

Добавлено: 12 ноя 2004, 04:09
Sergey
Anonymous писал(а):На триггерах невозможно гарантировать целостность т.к. FK работают вне транзакций а триггера - в транзакции.
Что за чушь! И на сколько мне помнится FK реализован как системный триггер!
Вне механизма транзакций существуют только генераторы!

Добавлено: 12 ноя 2004, 08:59
kdv
вы сами чушь-то поменьше пишите. FK контролирует ссылочную целостность, так? Каким образом? Посредством индекса. Индексы всегда "видят" все ключи для всех версий записей, независимо от транзакций. Поэтому целостность на FK, PK и Unique внетранзакционная (и это нормально).

Если же реализовать ссылочную целостность на триггерах, то можно спокойно
1. в одной транзакции изменить код у записи справочника
2. во второй транзакции сослаться на этот код для другой таблицы
3. сделать commit первой и второй транзакции, и получить что?
правильно, во второй таблице ссылку на НЕСУЩЕСТВУЮЩИЙ код справочника.

А FK, поскольку "видит" изменения вне транзакций, не даст это сделать т.к. увидит, что код справочника поменялся. или не даст его поменять, и т.п.

Точно также ПК - вставляем в справочник запись с кодом, параллельно из другой транзакции нам запись с таким же кодом вставить не дадут. Почему? Потому что уникальный индекс по ПК видит все изменения (не committed) и не даст создать дубликат ключа.

А "системные триггеры" по FK делаются только на каскадных update/delete, и опять же, они действуют тоже вне транзакций.

Вы что думаете, что если сервер дает возможность работать с транзакциями, то сам он дурак, и для специфических операций тоже будет сам только транзакциями пользоваться? :D