Вы проверяете, совпадает ли введенный RECEIPTS1.rctmemenrolno с memenrolno в MEMAST, верно? Ну, триггер это неправильный способ сделать это.
Цикл полностью не масштабируется (чем больше строк в MEMAST, тем больше времени потребуется для вставки записи в RECEIPTS1). Но даже прямой поиск для проверки наличия указанного ключа все равно будет отстой. Также этот подход не может безопасно работать в многопользовательской среде, потому что Oracle использует уровень изоляции READ COMMITTED. Другими словами, пока ваша транзакция выполняет проверку, другой сеанс удаляет только что найденную строку. Что приводит к повреждению базы данных.
Единственный правильный способ сделать это - с помощью ограничения внешнего ключа.
alter table receipt1
add constraint receipts1_memast_fk foreign key (rctmemenrolno)
references memast (memenrolno);
Конечно, это предполагает, что у вас есть первичный ключ - или уникальное ограничение - на memast для обеспечения уникальности memenrolno. Я искренне надеюсь, что вы не пытаетесь навязать его уникальность с помощью триггеров.
редактировать
«У меня уже есть 1 первичный ключ в качестве MEMID для таблицы memmast»
Если между MEMID и MEMENROLNO существует взаимно-однозначное отношение, которое является обычным явлением, когда у нас есть бизнес-ключ и суррогатный ключ, тогда правильным решением будет использование первичного ключа в RECEIPTS1. То есть отбросьте столбец RCTMEMENROL и замените его на RCTMEMID. Затем вставьте имена этих столбцов в оператор alter table
. Внешний интерфейс будет отвечать за предоставление пользователям возможности поиска MEMID для данного MEMENROLNO, например виджета «Список значений».
Более грубым решением было бы создать уникальное ограничение для MEMAST.MEMENROLNO. Это не рекомендуется, поскольку использование естественных ключей для принудительного применения внешних ключей является плохой идеей и совершенно безумно, когда в рассматриваемой таблице уже есть синтетический первичный ключ.
Если между MEMID и MEMENROLNO нет взаимно-однозначных отношений, тогда я не знаю, какова цель проверки. Запрос на MEMAST может подтвердить существование данного MEMENROLNO сейчас , но без внешнего ключа он ничего не может сказать о состоянии базы данных через пять минут. Так зачем вообще проверять чек?