Сравнение: новое значение вставлено с помощью триггера - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать триггер, который проверяет, существует ли вставляемая строка в другой таблице.

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

У меня есть это:

create or replace trigger BIM
before insert on TABLE1 
for each row
begin
    if not exists (select 1 from TABLE2 where TABLE2.ID = :new.TABLE1.ID)
then
    raise_application_error(-20634, 'Error');
  end if;
end;

Но я получаю это:

PLS-00049: bad bind variable 'NEW.TABLE1'

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Гордон прав, предпочтительно использовать ограничение внешнего ключа для этого сценария.

Проблема с вашим кодом (за исключением ошибки, на которую указывал Гордон) заключается в том, что в отличие от немногих других СУБД, таких как Postgres, в Oracle вы не можете использовать EXISTS в выражениях / выражениях PL / SQL, таких как IF,Это должен быть чисто SQL-оператор.

create or replace trigger BIM
before insert on TABLE1 
 for each row
declare 
l_id_exists INT;
begin
    select CASE WHEN 
                 exists (select 1 from TABLE2 where TABLE2.ID = :new.ID) 
             THEN 1 
        ELSE 0 END INTO l_id_exists from dual;
   if l_id_exists = 0
   then
    raise_application_error(-20634, 'Error');
  end if;
end;
/

DEMO

1 голос
/ 20 марта 2019

Вам не нужно повторять имя таблицы:

create or replace trigger BIM
before insert on TABLE1 
for each row
begin
    if (select 1 from TABLE2 where TABLE2.ID = :new.ID and rownum = 0) is not null
then
    raise_application_error(-20634, 'Error');
  end if;
end;

Тем не менее, это странное требование.Я бы порекомендовал вам использовать ограничение внешнего ключа, но вы явно говорите «хотя бы один раз».Это заставляет меня подозревать, что у вас плохая модель данных - вам не хватает какой-то сущности, где id будет первичным ключом этой таблицы.

...