Ограничение двойной проверки в PL / SQL в рамках процедур - PullRequest
1 голос
/ 25 февраля 2012

Мне нужен совет по БД, в которой я работаю.

У меня есть БД, и сейчас я работаю над процедурами, функциями и триггерами (PL / SQL).Существует три объекта, два из которых наследуются от третьего (согласно концептуальной модели данных), так что это означает, что есть две таблицы, ссылающиеся на третий.Я должен одновременно вставить данные в родительскую и дочернюю таблицы, поэтому я подумал о создании процедуры, которая будет вставлена ​​в родительскую таблицу, и еще одной, которая будет вставлена ​​в дочернюю, которая может вызывать первую.

Моя проблема в том, что произойдет, если я попытаюсь вставить в родительскую таблицу, а затем в дочернюю, и по какой-то причине я вставляю данные в дочернюю таблицу, которые не удовлетворяют ограничениям?Другими словами, несмотря на ограничения, должен ли я все же проверять входные данные в функции?Каковы ваши предложения?

1 Ответ

2 голосов
/ 25 февраля 2012

Это зависит.

Предполагается, что существует ограничение внешнего ключа между дочерней таблицей и родительской таблицей, если вы попытаетесь вставить строку в дочернюю таблицу, используя ключ, который не существует в родительской таблице.INSERT сгенерирует исключение, указывающее, что ограничение было нарушено.Вам не нужно ничего проверять, если вы просто хотите, чтобы операция INSERT завершилась с ошибкой с исключением из-за нарушения ограничения.

С другой стороны, вы можете захотеть закодировать валидацию, чтобы обеспечить лучшие исключения длявызывающий абонент.Например, довольно распространено, что таблица будет иметь несколько внешних ключей, которые ссылаются на различные другие таблицы.Может быть полезно проверить, являются ли параметры действительными, чтобы вы могли более точно указать вызывающей стороне, какой параметр был недействительным.

Если вы спрашиваете, как убедиться, что либо вставка в родительскую таблицу, либо вставкав дочернюю таблицу успешно или что оба терпят неудачу, тогда вы говорите о том, как установить правильные транзакционные границы.Вы бы сделали что-то вроде

BEGIN
  insert_into_parent( <<list of parameters>> );
  insert_into_child(  <<list of parameters>> );
  commit;
EXCEPTION
  WHEN others 
  THEN
    rollback;
    RAISE;
END;

Обратите внимание, что ваши приложения PL / SQL всегда должны явно либо фиксировать, либо выполнять откат.И эти операторы управления транзакциями должны быть на самом высоком возможном уровне.Например, вы не захотите использовать операторы управления транзакциями в процедуре insert_into_parent, потому что тогда вы никогда не сможете использовать эту процедуру, если вам нужна более обширная область транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...