[Oracle] 33.동의어
동의어
데이터베이스의 객체에 대한 소유권은 해당 객체를 생성한 사용자에게 있습니다.
다른 사용자가 객체에 접근하기 위해서는 소유자로부터 접근 권한을 부여받아야 하며
다른 사용자가 소유한 객체에 접근하기 위해서는 소유자의 이름을 객체 앞에 지정해야 합니다.
이렇게 객체를 조회할 때마다 일일이 객체의 소유자를 지정하는 것이 번거로울 경우
동의어를 정의하면 긴 이름대신 간단한 이름으로 접근할 수 있게 됩니다.
예를 들어 우리가 전에 사용한 DUAL 테이블은 원래 SYS의 테이블이기에 다음과 같이 접근해야하지만,
SELECT *
FROM sys.dual;
공개 동의어가 dual로 정의되어 있기에 간단하게 접근 가능했던 것입니다.
SELECT *
FROM dual;
동의어는 개별 사용자를 대상으로 하는 비공개 동의어와 전체 사용자를 대상으로 한 공개 동의어가 있습니다.
동의어의 종류
- 비공개 동의어
객체에 대한 접근 권한을 부여받은 사용자가 정의한 동의어로 해당 사용자만 사용할 수 있다.
- 공개 동의어
권한을 주는 사용자가 정의한 동의어로 누구나 사용할 수 있다.
공개 동의어는 DBA 권한을 가진 사용자만이 생성할 수 있다.
비공개 동의어 생성과 사용
비공개 동의어를 생성하고 사용하는 과정에 대해 알아보겠습니다!
먼저, 유저 user01을 생성하고 접근 권한을 주겠습니다!
--SYS 계정
CREATE user user01 identified by 1234;
GRANT CREATE SESSION TO user01;
그리고 HR 계정에서 EMP 테이블에 대한 권한을 주겠습니다!
-- HR 계정
GRANT SELECT ON emp TO user01;
그러면 user01 계정은 hr 계정에 접근할 때 다음과 같이 해야합니다!
--user01 계정
SELECT *
FROM hr.emp;
이제 동의어를 생성해 볼까요? 그 전에 동의어 생성권한을 SYS 계정에서 받아야합니다.
--SYS 계정
GRANT CREATE SYNONYM TO user01;
드디어 동의어 생성!
--user01 계정
CREATE SYNONYM emp FOR hr.emp; --user01 에서만 사용가능
그러면 이제 다음과 같이 hr계정의 emp 테이블에 접근가능합니다!
--user01 계정
SELECT *
FROM emp;
공개 동의어 생성과 사용
공개 동의어는 DBA 계정에서 생성할 수 있습니다.
-- SYS 계정
CREATE PUBLIC SYNONYM h_jobs FOR hr.jobs;
위와 같이 동의어를 생성하면, hr계정의 jobs 테이블에 대한 권한이 있는 사용자 모두가 h_jobs라는 명으로 테이블에 접근가능합니다!
동의어 삭제
동의어 삭제는 DROP문을 이용합니다!
DROP SYNONYM h_jobs;