scott 이라는 계정에서 tester라는 계정의 테이블을 사용 할때 계정별 권한을 주면 사용이 가능하다.

하지만, 프로시저에서 tester의 테이블을 사용 하려 할때,

PL/SQL: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

이런 에러가 나오면서 컴파일 오류가 난다.

프로시저에서는 저런 오류가 나지만, 그냥 select * from tester.table 이런식으로 조회를 하면

조회가 가능하다.

권한 설정을 할때, 계정에 권한 설정 뿐만 아니라 프로시저에서 사용을 하려면

조회하려는 계정으로 들어가서 해당 테이블의 조회 권한을 직접 설정 해주어야 한다.

테스트를 해보자.

해당 테이블에 대한 권한을 직접 주어야합니다.

아래는 테스트내용이구요 참고해보세요..

--롤(DBA롤도 포함)을 이용해서 오브젝트 권한을 줄 경우 조회는 되나 프로시져나 펑션에서는 테이블 찾을 수
   없다는 메세지가 나옴
--오브젝트에 대한 직접적인 권한을 주어야 사용할 수 있음

--유저생성
CONNECT SCOTT/TIGER;
CREATE USER TESTER  IDENTIFIED BY TEST DEFAULT TABLESPACE DPDS;
GRANT DBA, CONNECT, RESOURCE TO TESTER;

--해당유저에서 작업
CONNECT TESTER/TEST;

CREATE SYNONYM EMP FOR SCOTT.EMP;

SELECT * FROM EMP; --정상조회

CREATE OR REPLACE PROCEDURE SP_DELETE_EMP AS
v_test NUMBER;
BEGIN
   SELECT COUNT(EMPNO)
     INTO v_test
     FROM EMP;
   v_test := SQL%ROWCOUNT;
   dbms_output.put_line('???????? : ' || v_test);
   ROLLBACK;
END;       
--컴파일 시 에러발생 PL/SQL: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다
--테이블 원 소유자 계정으로 접속 - OBJECT에 대한 DIRECT GRANT 부여

CONNECT SCOTT/TIGER;

GRANT SELECT ON SCOTT.EMP TO TESTER;

--TESTER유저의 SP_DELETE_EMP 객체가 정상 컴파일 됨

+ Recent posts