2017-10-30 1 views
0

다른 테이블에 레코드를 추가 할 때마다 테이블을 업데이트하는 트리거를 작성하고 있습니다. 기본적으로 사용자 레코드 용 테이블이 있습니다. 해당 테이블에 레코드를 추가 할 때마다 트리거를 사용하여 해당 새 사용자에 대한 권한을 생성해야합니다. 모든 사용자 역할과 관련 권한이 저장된 테이블이 있습니다. 새 사용 권한을 만드는 방법은 users 테이블과 role_permissions 테이블간에 완전 외부 조인을 사용하는 것입니다. 즉, SQL 내가 트리거를 사용하여이 동작을 복제하기 위해 노력하고있어이오라클 삽입 트리거

insert into user_perms (user_id, perm_id, value) 
select personnel.user_id AS user_id, role_perms.perm_id AS perm_id, role_perms.value AS value 
from personnel 
full outer join role_perms on role_perms.personnel_role_id = personnel.personnel_role_id 
where personnel.user_id = NEW USER ID; 

것 같습니다. 나는 그것이 작동하도록 할 수 없습니다. 지금까지 내가 가진 방아쇠는 다음과 같습니다.

CREATE OR REPLACE TRIGGER create_perms_on_create_user 
BEFORE INSERT 
    ON users 
FOR EACH ROW 
DECLARE 
    v_user_id number(25); 

BEGIN 

    -- Find user_id of the record being inserted into the table 
    SELECT :NEW.user_id INTO v_user_id 
    FROM users; 

    -- Insert records into user_perms table 
    insert into user_perms 
    (user_id, 
    perm_id, 
    value) 
    select personnel.user_id AS user_id, 
      role_perms.perm_id AS perm_id, 
      role_perms.value AS value 
    from personnel 
    full outer join role_perms 
    on role_perms.personnel_role_id = personnel.personnel_role_id 
    where user_id = v_user_id; 

END; 

/

지금이 오류가 발생합니다.

ORA-01422는 : 정확한 내가 처음에 삽입 후으로 작동 할 수 있습니다 생각 행

의 요청 수보다 많은 수익을 가져,하지만 그래서 내가 전에 그것을 시도 작동하지 않았다. 나는 지금 다음에 어떤 것을 시도 할 지 확신하지 못한다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

각 사용자마다 :NEW.user_id INTO v_user_id을 넣으려고합니다. 그래서 여러 결과 오류가 발생합니다. 대신 쿼리에서 값을 사용하십시오.

insert into user_perms 
    (user_id, perm_id, value) 
    select :NEW.user_id AS user_id, 
      role_perms.perm_id AS perm_id, 
      role_perms.value AS value 
    from personnel 
    full outer join role_perms 
    on role_perms.personnel_role_id = personnel.personnel_role_id 
    where user_id = :NEW.user_id ; 

참고 : 트리거를 넣는 순서는주의하시기 바랍니다. 어쩌면 데이터가 아직 거기 있지 않을 수도 있습니다.

+0

좋아, 내가 몇 가지 리팩토링을했는데 지금은이 오류가 발생합니다. '테이블 OK_LIBRARIES_DEV.PERSONNEL이 변경 중입니다. 트리거/함수에 표시되지 않습니다. ' 사용자 테이블에서 데이터를 호출했기 때문에 personnel 테이블에서 실행되도록 트리거가 변경되었지만 사용자 테이블 이후에 업데이트되지 않습니다. 또한 트리거를 이후 트리거로 변경하고 제안 사항을 따랐습니다. 당신이 명백한 오류를 발견하지 않으면 나는 스스로를 디버깅 할 것입니다. 도와 주셔서 감사합니다. –