Synonym
- DB의 객체는 각자 고유한 이름이 할당되어 있다.
- ALIAS처럼 동의어를 만드는것이 바로 시노님이다.
- ALIAS는 1회성인 반면 시노님(Synonym)은 영구적이다.
- 보통 다른 유저의 객체를 참조할 때 많이 사용을 한다.
- 다른 유저의 객체를 사용할때 유저의 이름과 객체의 실제이름을 사용하는데(계정명.객체명) 그 두개를 감춤으로써 데이터베이스의 보안을 개선하기위해 사용되어진다.
- 시노님에는 PUBLIC과 PRIVATE타입이 있다.
- PUBLIC은 모든 사용자가 접근할 수 있고 PRIVATE는 특정사용자에게만 참조가 가능하다.
Synonym 선언
CREATE [OR REPLACE] [PUBLIC]
SYNONYM '[스키마명].[시노님명]'
FOR '스키마명.대상오브젝트형'
- OR REPLACE : 시노님을 수정할 때 DROP 하지 않고 기존 생성 쿼리를 사용하여 수정할 수 있다.
- PUBLIC : PUBLIC를 생략하면 PRIVATE로 시노님이 생성된다.
- PUBLIC : PUBLIC 시노님으로 생성할 경우 대상 오브젝트의 권한을 가지고 있는 모든 스키마에 해당 시노님을 사용할 수 있다. 스키마마다 시노님을 생성해 줄 필요 없음.
- PRIVATE : 시노님을 생성한 스키마에서만 해당 시노님을 사용할 수 있다. (user1 계정에서 시노님을 생성하였다면 user1 계정에서만 해당 시노님을 사용가능 함)
- user1계정에서 시노님 이름을 user1에 속해있는 객체명과 같게 public으로 생성하고 객체를 호출한다면(시노님명 = 객체명) 계정에 속해있는 객체가 먼저 호출된다. 이후에 해당 객체명이 없다면 시노님명으로 찾아온다.
- [스키마명].시노님명 : 자신의 계정에서 시노님을 생성할 경우 [스키마명]은 생략이 가능, 타 계정에서 시노님을 생성해 줄 경우 명시해야 한다. (계정명.시노님명)
예제
다음과 같이 synonym을 선언할 수 있다.
-- PUBLIC SYNONYM 선언
CREATE PUBLIC SYNONYM card_data FOR user1.card_data
-- PRIVATE SYNONYM 선언
CREATE PUBLIC SYNONYM card_data FOR user1.card_data
아래 예제를 통해 위의 설명을 뒷받침 해본다.
일단 유저가 두 명 (user1 / user2)이 있고 user1이 가지고 있는 테이블에 대해 user2가 접근이 가능하도록 권한을 먼저 준다.
GRANT ALL ON oracleStudy TO user2;
-- GRANT SELECT ON oracleStudy TO user2;
여기서는 모든 권한을 주고 싶으면 ALL, SELECT 권한만 주고자 한다면 SELECT만 사용.
이제 user2가 user1의 card_data 테이블에 다음과 같이 접근할 수 있다.
SELECT * FROM user1.card_data;
이럴 경우 본문 초반에 설명한 것처럼 실제 유저의 이름과 객체명을 그대로 사용해서 접근하는데 synonym을 통해 보안성을 높일 수 있다.
CREATE SYNONYM u1_card_data FOR user1.card_data;
이런 식으로 시노님(Synonym)을 생성해주면, synonym으로 만든 이름으로 접근이 가능하다.
SELECT * FROM u1_card_data
시노님(Synonym) 삭제
DROP SYNONYM u1_card_data
출처 및 인용