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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
jbond

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

Сообщение jbond » 05 ноя 2004, 13:59

Как лучше поддерживать ссылочную целостность?
С помощью FK или все-таки триггеры?
FireBird 1.5 Final

kdv

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

Сообщение kdv » 05 ноя 2004, 14:49

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 работают вне транзакций а триггера - в транзакции.

Vemer
Сообщения: 8
Зарегистрирован: 09 ноя 2004, 15:01

Сообщение Vemer » 11 ноя 2004, 19:40

Интересно, как можно внести изменения в базу вне контекста транзакций? Или я что-то не понял?

Sergey
Сообщения: 21
Зарегистрирован: 27 окт 2004, 04:05

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

Сообщение Sergey » 12 ноя 2004, 04:09

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 ноя 2004, 08:59

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

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

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

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

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

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

Ответить