본문 바로가기
Oracle/Index, Sequence, Synonym

데이터 베이스_ 오라클 [동의어, Synonym] 개요 및 간략 활용

by Super Santj 2019. 7. 3.

select * from tab; // 테이블의 별칭 (=동의어), (Synonym(시노님, 동의어))의 개요, 사용-> 사용권한 -> 단어는 다르지만 의미가 같은것(별칭, 별명(사람))

별칭은 테이블에 우리가 부여를 할수가있음, [테이블은 하나인데 이름이 2개]

dept---------------------------->test 처럼 똑같다.

형식_

create synonym 동의어 이름 for 대상객체명(=테이블명) 이또한 DDL문이다. 생성시 아래와 같다.

SQL> create synonym buser for b_dept2;

동의어가 생성되었습니다.

탭타입 SYNONYM 이라는 항목이 생성 되었다. 테이블 이름은 BUSER

우선 BUSER라는 동의어 테이블은 만들어졌고, 실제 데이터도 동일한지 확인하게된다면

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN

7 개의 행이 선택되었습니다.

SQL> select * from buser;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN

7 개의 행이 선택되었습니다.

동일한 결과값을 호출할수가있다. 여기서 백업테이블과 다른점은 무엇인가? 라는 질문을 할수가있는데 백업 테이블과 동의어 테이블은 전혀 다른 테이블이다. 기존 테이블에서 수정을 하면 동의어 테이블의 데이터는 자동으로 수정이되지만, 백업 테이블을 수정이 안되기때문이다. 백업테이블과는 이러한 차이점이 있다는것을 잊어선 안된다. 

아래 실행결과가 이를 증명해 준다.

SQL> insert into buser values(80,'TESTING3','TESTLOC');

1 개의 행이 만들어졌습니다.

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        80 TESTING3       TESTLOC

8 개의 행이 선택되었습니다.

동의어 테이블에 80번 부서의 TESTING3의 이름을 갖고있고, TESTLOC라는 위치에 있는 데이터가 b_dept2 테이블에 생성이 되었음을 확인할수가 있다. 이것이 가능한 이유는 우리는 동의어라는 방식을 통해 생성을 하였음을 알고있다.

즉 동의어 테이블과 백업테이블은 이러한 차이가있다.

추가개요_

동의어를 만드는 이유는 무엇일까 ? 동의어를 만드는 이유는 사용 권한과 연관이 있다. 그렇다면 사용권한은 무엇인가?사용권한은 DCL문이다. 즉 권한과 연관이 있다는것을 알수가 있다. 사용권한은 일반유저가 아닌 관리자 입장에서 사용을 해야하는것이다.

오라클은 계정별로 관리를 하기때문에, 오라클의 계정은 계정별로 속한 테이블만 사용이 가능하다. 즉 계정의 권한이 서로 다르기에, 계정별로 컨트롤 할수있는 테이블을 구분하기위해 동의어를 사용하여, 오라클을 제어한다. 각자의 영역이기에 자기만의 작업을 원활히 하기위해서 사용을 하는것이고, 타 부서와의 협력과정속 꼬임을 방지하고자 미리 제어할 영역을 구분짓는 방식이다.

scott 계정은 b_emp5,b_dept2,,,이외에 (insert,update,delete,select)를 제어할수가있는데, 보통 select 권한을 주지는 않고 view 권한을 준다. 여기서 4가지 또는 5가지 권한을 주었을때 테이블을 보다 안전하게 관리하기위해 동의어를 사용한다.

즉 핵심 포인트는, 서로 다른 계정에서의 특정 계정의 테이블을 사용하기위해 사용한다.

여기서

**중요**

동의어의 종류_

동의어의 종류 참고 사진

1. 개인용(private synonym) -> 각 계정별로 따로따로 필요에 따라서 만드는 경우(자기 계정만 사용이 가능한 경우) 전용 동의어.

2. 공용(public synonym) -> 관리자만이 만드는 경우, 모든 계정들이 사용할 수 있는 동의어를 만드는 경우

**중요**

test====>scott계정에게 b_dept2(insert,select)테이블에 괄호안에 두가지 권한을 부여한다는 가정을 한다면.

로그인된 사람이 누구인지 확인한후

>show user

scott계정으로 로그인이 되어있다면 접속 SQL 구문을 통해 conn test/t1234 로 접속

그리고 b_dept2라는 테이블을 test 계정이 소유하고있는지를 확인해보게되면, test는 해당 테이블을 갖고 있지 않다는것을 확인할수가 있고, 호출할수없다는 오류가 발생한다. 이렇게 하는 경우는 오로지 본인이 갖고있는 테이블만 제어 할수밖에 없다. 즉 먼저 테이블을 소유하고있는 계정에게 사용해도 되는지에대한 권한을 부여받아야한다.

사용권한 -> 사용하고자하는 테이블의 주인,소유자에게 허락을 받는것이다. 인증을 받는것이다.

이러한 행위를 전문용어로 grant 라고 칭하고. 권한 회수 명령어는 revoke 이다.

형식2_ 허락받기

허락받을 계정으로 로그인을 한 후, DCL 문을 선언한다.

grant 권한종류 (insert,update,delete,select 총 4가지를 부여할수있다. 만약 다 부여한다면 all 을 기재하면됨) on 적용테이블명 to 계정명 1,2,3,4,5,,,, (모든 계정에게 할시 public으로 선언하면 된다.)

SQL> grant insert,select on b_dept2 to test;    //test 계정에게 b_dept2 테이블 상의 insert, select권한을 부여하였다.

권한이 부여되었습니다.

그리고 권한이 주어졌는지 test 계정으로 로그인

SQL> conn test/t1234
연결되었습니다.

SQL> select * from b_dept2;
select * from b_dept2
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

접속후 확인차 선언을 하였으나, 오류 발생. 그이유는 권한 상속을 받았다면 반드시 [소유자명.테이블명]을 기재해야한다.

SQL> select * from scott.b_dept2;     <== 소유자 scott, 테이블명 b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        80 TESTING3       TESTLOC

8 개의 행이 선택되었습니다.

즉 이렇게 매번 권한 받을 테이블을 호출할때 소유자의 이름을 항상 테이블명 앞에 기재를 해야하는 수고스러움을 덜어내기위해 동의어를 사용하는것이다.

scott.b_dept2 ==> buser2 이름을 내것처럼 사용.

아래와 같다

동의어 호출 내용

 

댓글