У меня определены родительские / дочерние отношения, которые, к сожалению, невозможно поддерживать с помощью внешнего ключа.Родители и дети хранятся в одной таблице.Родительские / дочерние отношения идентифицируются столбцом «ITEM_ID».Дочерний ITEM_ID состоит из его родительского ITEM_ID, а затем того, что мы можем эффективно рассматривать как уникальный идентификатор дочернего элемента в этом родительском элементе.
Я реализую процедуру PL / SQL для удаления записей из этой таблицы ITEM.Первая часть процедуры проверяет наличие каких-либо детей;в этом случае возникает ошибка приложения (имитирующая внешний ключ).
Мне интересно, как предотвратить вставку дочерних записей другим процессом в промежутке времени, когда курсор в моей процедуре удаления заполнен и заблокирован? "FOR UPDATE "и точка, в которой родительская запись фактически удалена.
Нужно ли блокировать всю эту таблицу во время этого процесса?
Или я должен изменить процедуру вставки, чтобы выбратьродительская запись «ЗА ОБНОВЛЕНИЕ»?
ОБНОВЛЕНИЕ: Я создал приведенный выше пример просто для описания общей ситуации, но для обоснования проблемы с внешним ключом / ограничением, я приведу фактическую / болеесложная структура ниже:
В удаленной базе данных есть несколько таблиц: COMPANY, BUILDING, FLOOR.В нашей организации этажи принадлежат зданиям, а здания - компаниям.
Приложение, над которым я работаю, связывает роли с сотрудниками.Таблица, которая связывает Employee (идентификатор сотрудника) с ролью (Role ID), также имеет столбец «Расположение».Столбец location соответствует идентификатору одной из таблиц удаленной базы данных, и мы определяем, к какой таблице он принадлежит, на основе столбца Type в таблице Role.
Например, вот несколько записей из моей таблицы:
Role = Janitor
Type = BUILDING
Location = COMPANY1-BUILDING1
Parent Role = Manager
Role = Manager
Type = COMPANY
Location = COMPANY1
Parent Role = CEO
Как вы можете догадаться, идентификаторы этажей имеют формат company-building-floor в таблице удаленной базы данных.
Дворник привязан к уровню BUILDING и, соответственно, к его местоположениюстолбец - это идентификатор BUILDING (который фактически является идентификатором компании, за которым следует идентификатор здания в таблице BUILDING).