시노님 Synonym 은 ‘동의어’란 뜻이다.
데이터베이스 객체는 각자 고유한 이름이 있는데,
이 객체들에 대한 동의어를 만드는 것이 바로 시노님이며 이 또한 데이터베이스 객체에 속한다.
예를 들어, 이순신이란 작가가 있는데 이 사람의 인생모토가 “나를 알리지 마라!” 여서 홍길동이란 필명을 사용한다고 한다.
따라서 이 작가의 가족을 제외한 일반 독자들은 이 사람을 홍길동이라고 알고 있다.
여기서 ‘이순신’이 원래 객체명이라면 ‘시노님’은 바로 홍길동이 되는 것이다.
시노님에는 PUBLIC과 PRIVATE 시노님이 있다.
PUBLIC은 ‘공동’이란 의미가 있듯이 PUBLIC 시노님은 데이터베이스의 모든 사용자가 접근할 수 있다.
이에 반해 PRIVATE 시노님은 특정 사용자에게만 참조되는 시노님이다.
CREATE OR REPLACE [PUBLIC] SYNONYM [스키마명.]시노님명
FOR[스키마명.]객체명;
PUBLIC을 생략하면 PRIVATE 시노님이 만들어 진다.
참고로 PUBLIC 시노님은 DBA 권한이 있는 사용자만 생성 및 삭제가 가능하다.
FOR절 이하의 객체에는 테이블, 뷰, 프로시저, 함수, 패키지, 시퀀스 등이 올 수 있다.
CREATE OR REPLACE SYNONYM syn_channel
FOR channels;
결과
synonym SYN_CHANNEL이(가) 생성되었습니다.
channels 테이블에 대한 시노님이 만들어 졌으므로 어느 사용자나 ‘syn_channel’이라는 이름으로 channels 테이블 조회가 가능하다.
SELECT COUNT(*)
FROM syn_channel;
결과
COUNT(*)
----------
5
다른 사용자로 로그인해서 앞서 만든 시노님을 참조해 보자.
오라클을 설치할 때 자동으로 생성되는 사용자 중 HR 사용자가 있는데 디폴트로 계정이 잠겨 있으므로,
먼저 잠긴 계정을 풀고 비밀번호도 HR로 설정해 보자.
ALTER USER hr IDENTIFIED BY hr ACCOUNT UNLOCK;
결과
user HR이(가) 변경되었습니다.
이제 HR 사용자로 로그인해서, syn_channel을 조회해 보자.
SELECT COUNT(*)
FROM ora_user.syn_channel;
결과
SQL 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.
왜 오류가 난 것일까?
권한이 없어서 그렇다.
HR 사용자에게 SELECT 권한을 주면 된다.
다시 ora_user로 접속해 권한을 주고, 다시 조회해 보자.
GRANT SELECT ON syn_channel TO HR;
결과
GRANT을(를) 성공했습니다.
SELECT COUNT(*)
FROM ora_user.syn_channel;
결과
COUNT(*)
----------
5
이번엔 PUBLIC 시노님을 생성해 보자.
CREATE OR REPLACE PUBLIC SYNONYM syn_channel2
FOR channels;
결과
public synonym SYN_CHANNEL2이(가) 생성되었습니다.
만들어진 시노님의 조회 권한을 PUBLIC에 준다.
GRANT SELECT ON syn_channel2 TO PUBLIC;
결과
GRANT을(를) 성공했습니다.
HR 사용자로 로그인해 조회해 보자.
SELECT COUNT(*)
FROM syn_channel2;
결과
COUNT(*)
----------
5
PUBLIC 시노님은 소유자명을 붙이지 않아도 참조가 가능한데,
그 이유는 해당 시노님의 소유자가 시노님을 만든 ora_user가 아닌 PUBLIC이 되기 때문이다.
생성된 시노님 정보는 PRIVATE은 USER_SYNONYMS, PUBLIC까지 보려면 ALL_SYNONYMS를 참조하면 된다.
시노님을 사용하는 이유를 정리해 보면 다음과 같다.
- 데이터베이스의 투명성을 제공하기 위해서 사용한다. 다른 사용자의 객체를 참조할 때 많이 사용한다.
- 일단 시노님을 생성해 놓으면 나중에 이 시노님이 참조하고 있는 객체의 이름이 바뀌더라도
이전에 작성해 놨던 SQL문을 수정할 필요가 없다. - 시노님은 별칭이므로 원 객체를 숨길 수 있어 보안 측면에서 유리하다.
PRIVATE 시노님은 다른 사용자가 참조할 때 소유자명.시노님명 형태로 사용하지만, PUBLIC은 소유자명까지 숨길 수 있다.
'oracle' 카테고리의 다른 글
데이터베이스 객체 _시퀀스 (생성) (0) | 2021.04.01 |
---|---|
데이터베이스 객체 _시노님 (삭제) (0) | 2021.04.01 |
데이터베이스 객체 _인덱스 (삭제) (0) | 2021.04.01 |
데이터베이스 객체 _인덱스 (생성) (0) | 2021.04.01 |
데이터베이스 객체 _뷰 (삭제) (0) | 2021.04.01 |