>

삽입 될 행이 다른 테이블에 있는지 확인하는 트리거를 작성하려고합니다.

기본적으로 2 개의 테이블은 하나의 열 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'


  • 답변 # 1

    고든이 맞습니다.이 시나리오에서는 외래 키 제약 조건을 사용하는 것이 좋습니다.

    Gordon이 지적한 오류를 제외하고 코드 문제는 Postgres와 같은 다른 DBMS와 달리 Oracle에서 EXISTS 를 사용할 수 없다는 것입니다   IF 와 같은 PL/SQL 표현식/문에서 . 순전히 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

  • 답변 # 2

    테이블 이름을 반복하지 않아도됩니다 :

    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 가있는 일종의 엔티티가 빠져 있습니다.  해당 테이블의 기본 키가됩니다.

  • 이전 asp.net mvc - Google 보고서는 Mvc C #의 PDF 보고서에 표시되지 않습니다
  • 다음 java - 내 HostnameVerifier 구현을 사용하도록 Jetty HTTP/2 클라이언트 구성