콘텐츠로 이동

CREATE SYNONYM

CREATE SYNONYM#

구문#

create_synonym ::=#

create_synonym_image111

전제 조건#

아래의 조건 중 하나 이상을 만족해야 한다.

  • SYS 사용자이다.
  • 사용자 자신의 스키마에 시노님을 생성하려면, CREATE SYNONYM 또는 CREATE ANY SYNONYM 시스템 권한을 가지고 있어야 한다.
  • 다른 사용자의 스키마에 시노님을 생성하려면, CREATE ANY SYNONYM 시스템 권한을 가지고 있어야 한다.
  • PUBLIC 시노님 생성하려면, CREATE PUBLIC SYNONYM 시스템 권한을 가지고 있어야 한다.

설명#

이 구문은 시노님을 생성하는 SQL문으로, 시노님이란 다음 객체들에 대한 별칭을 의미한다.

  • 테이블
  • 시퀀스
  • 저장 프로시저 및 저장 함수
  • 다른 시노님

다음 SQL문에서 시노님을 사용할 수 있다.

DML 문 DDL 문
SELECT
INSERT
UPDATE
DELETE
MOVE
LOCK TABLE
MERGE
ENQUEUE
DEQUEUE
GRANT
REVOKE

OR REPLACE#

이 절은 시노님이 이미 존재한다면 재생성 할 것을 지정한다. 이 절을 사용하면 사용자가 시노님을 먼저 삭제하지 않고도 존재하는 시노님의 정의를 변경할 수 있다.

PUBLIC 시노님과 PRIVATE 시노님#

PUBLIC 시노님은 모든 사용자가 사용할 수 있는 시노님이며, PRIVATE 시노님은 그 시노님의 소유자만 사용할 수 있는 시노님이다.

PUBLIC 시노님을 생성하려면 이 구문에 PUBLIC을 명시해야 한다. 이를 명시하지 않으면 기본으로 PRIVATE 시노님이 생성된다.

user_name#

시노님 앞에 위치하는 사용자명은 시노님 소유자명이다.

PUBLIC 시노님을 생성하는 경우에는 소유자명을 명시하지 않는다.

PRIVATE 시노님을 생성하는 경우에 소유자명을 명시할 수 있다. 소유자명을 명시하지 않을 경우 시노님은 CREATE SYNONYM문을 수행하는 세션에 연결된 사용자의 스키마에 생성된다.

synonym_name#

생성할 시노님 이름과 동일한 이름의 테이블, 뷰, 시퀀스, 저장프로시저, 저장함수, 또는 다른 시노님이 존재할 경우에는 오류가 반환된다. 시노님은 이들 객체와 동일한 이름 영역 (namespace)에 저장되므로, 시노님의 이름은 자신이 속할 스키마 내에서 유일해야 한다. 시노님의 이름은 "객체 이름 규칙"을 따라야 한다.

FOR clause#

별칭을 제공할 대상 객체를 명시하는 절이다.

user_name#

별칭을 제공할 대상 객체의 소유자명을 명시한다. 지정하지 않을 경우에 Altibase는 현재 세션에 접속되어 시노님을 생성하고 있는 사용자의 스키마에 속하는 것으로 간주한다.

object_name#

별칭을 제공할 대상 객체명을 명시한다.

만약 그 객체가 데이터베이스 내에 존재하지 않더라도 시노님 생성 시에는 오류가 리턴되지 않고 시노님 생성은 성공한다. 즉, 시노님 생성시에는 대상 스키마 객체가 현재 존재하지 않아도 되며, 별칭을 제공할 객체에 대한 권한이 없어도 된다.

권한과 시노님#

시노님에 대한 DML문을 수행하기 위해서는 사용자가 시노님의 대상 객체에 대한 DML 실행 권한을 가지고 있어야 한다.

시노님에 대하여 DML 실행 권한을 부여 또는 박탈할 때, 실제로는 시노님의 대상이 되는 객체에 그 권한이 부여되거나 박탈된다.

따라서 시노님에 대한 DML문 수행 시 권한 오류가 발생하는 경우, 시노님 대상 객체에 대한 DML 실행 권한이 사용자에게 부여되어 있는지 SYS_GRANT_SYSTEM_ 또는 SYS_GRANT_OBJECT 메타 테이블에서 확인해야 한다. 사용자에게 적절한 권한이 없는 경우 권한을 부여해야 한다. 사용자에게 권한을 부여할 때, 대상 객체에 대한 권한을 부여하여도 되고 시노님에 대한 권한을 부여해도 된다.

사용자에게 대상 객체에 대한 적절한 권한이 이미 있다면 시노님을 생성한 후 시노님에 대한 권한까지 부여할 필요는 없다.

또한 시노님에 대한 권한을 부여함으로써 객체에 대한 권한이 부여된 경우, 해당 시노님이 삭제되더라도 객체에 대한 권한은 그대로 유지된다. 이는 시노님에 대한 권한을 부여하더라도 실제로는 시노님 자체에 대한 권한이 아니라 시노님 대상 객체에 대한 권한이 부여되기 때문이다.

객체 이름 검색 우선 순위#

SQL문에서 참조되는 객체가 데이터베이스 내의 어떤 객체인지를 결정하기 위해서, Altibase는 테이블, 뷰, 시퀀스, 저장프로시저, 또는 저장함수의 이름을 먼저 찾아본다. 여기에 존재하지 않으면 그 이름의 시노님을 찾는다. 시노님 내에서는 PRIVATE 시노님이 PUBLIC 시노님보다 검색 우선 순위가 높다.

예를 들어 SQL문에서 참조되는 이름을 가지는 객체가 데이터베이스에 존재하는지 Altibase가 검사하는 순서는 다음과 같다.

SELECT * FROM NAME;
  1. "NAME"이라는 이름의 테이블 또는 뷰를 찾는다.
  2. 이름이 "NAME"인 테이블 또는 뷰가 존재하지 않으면 현재 세션에 접속한 사용자의 스키마에서 그 이름의 PRIVATE 시노님을 찾는다.
  3. 그 이름의 PRIVATE 시노님이 존재하지 않으면 PUBLIC 시노님을 찾는다.
SELECT * FROM USER.NAME;
  1. "USER" 스키마에서 "NAME"이라는 이름의 테이블 또는 뷰를 찾는다.
  2. 이름이 "NAME"인 테이블 또는 뷰가 존재하지 않으면 "USER" 스키마에서 그 이름의 PRIVATE 시노님을 찾는다.
  3. 그 이름의 PRIVATE 시노님이 존재하지 않으면, PUBLIC 시노님을 찾지는 않는다. 대신 오류를 반환한다.

예제#

<질의> 사용자 altibase가 소유한 dept 테이블에 별칭으로 my_dept라는 시노님을 현재 사용자 소유로 생성하고 이 시노님을 이용해서 DML문을 수행한다.

iSQL> CONNECT altibase/altibase;
Connect success.
iSQL> CREATE TABLE dept 
     (
     id integer,
     name char(10), 
     location varchar(40), 
     member integer
     );
Create success.
iSQL> GRANT INSERT ON dept TO mylee;
Grant success.
iSQL> GRANT SELECT ON dept TO mylee;
Grant success.
iSQL> CONNECT mylee/mylee;
Connect success.
iSQL> CREATE SYNONYM mylee.my_dept FOR altibase.dept;
Create success.
iSQL> INSERT INTO my_dept VALUES (1,'rndn1',NULL,4);
1 row inserted.
iSQL> SELECT * FROM my_dept;
MY_DEPT.ID  MY_DEPT.NAME  MY_DEPT.LOCATION 
-------------------------------------------------------
MY_DEPT.MEMBER 
-----------------
1           rndn1 
4           
1 row selected.