2010년 1월 20일 수요일

[오라클/시노임]oracle synonym

내가 운영중인 채팅사이트 조이팅스토리에 테이블과 관련해서 무언가를 하려니....
시노임이 좀 문제가 되었다...
시노임으로 해결할 수도 있지만...
요게 더 편리한 듯.... ALTER SESSION SET CURRENT_SCHEMA=유저; (제일 아래... 설명)



동의어
다른계정의 테이블을 불러올때 사용
보안, 권한문제,긴이름을 짧게하여 사용 등등

문법
CREATE SYNONYM 시노님명
FOR 유저명.테이블명

유저 생성.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



 생성된 유저에 테이블 생성
이미지를 클릭하시면 원본크기로 보실수 있습니다.

생성된 테이블에 데이터 입력
이미지를 클릭하시면 원본크기로 보실수 있습니다.


SYS 계정에서 TEST_SYNONYM 이라는 SYNONYM 생성.
이미지를 클릭하시면 원본크기로 보실수 있습니다.


SCOTT 계정에서 시노님명을 select 하면 검색 할수 있다.
하지만 테이블로 존재하는것은 아니다.
 이미지를 클릭하시면 원본크기로 보실수 있습니다.









test_synonym 에 대한 scott 계정의 권한주기



sys 계정으로 다음과 같은 권한 부여
이미지를 클릭하시면 원본크기로 보실수 있습니다.



scott으로 와서 select와  insert 해본다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.





 다시 sys 계정에서 scott의  select 권한을 취소한다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



그러면 더이상 scott 계정으로 test_synonym을 select 할수 없게된다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.


GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON 테이블명 TO 사용자
GRANT ALL PRIVILEGES ON 테이블명  TO 사용자명

출처: http://www.cyworld.com/jokercokr2/2513686



---------------------------------------------------------------------------------------------------------
뽀나스

** Synonym 생성 문법 **
**[ Syntax ]*************************************************
* CREATE [PUBLIC] SYNONYM synonym_name
* FOR object_name
*************************************************************

- Public : 모든 사용자가 접근 가능한 시노님을 생성 합니다.
              Public Synonym의 생성 및 삭제는 DBA만이 할 수 있습니다.

                                                                                                                                      
※ scott USER의 emp테이블을 test USER가 사용하는 예제

1. 먼저 scott/tiger USER로 접속해서 test USER에게 emp테이블을 조작할 권한을 부여합니다.

SQL> GRANT ALL ON emp TO test;
         권한이 부여되었습니다.

test user에 대하여 scott의 emp테이블을 조작할 수 있는 권한을 부여 합니다.
권한이 있어야 select하거나 update, insert할 수 있습니다.

2. test USER로 접속해 동의어를 생성합니다.

SQL> connect test/test

SQL> CREATE SYNONYM scott_emp FOR scott.emp;
시노님이 생성되었습니다.

scott USER가 소유하고 있는 emp테이블에 대해 scott_emp라는 일반시노님을 생성 했습니다.
scott 사용자의 emp테이블을 test사용자가 scott_emp라는 동의어로 사용 합니다.

-- 시노님을 이용한 쿼리
SQL> SELECT empno, ename FROM scott_emp;

-- 일반 테이블을 쿼리
SQL> SELECT empno, ename FROM scott.emp;
이 두쿼리의 결과는 같습니다.

   EMPNO ENAME
-------- ---------
    7369 SMITH
    7499 ALLEN
    7521 WARD
    7566 JONES
    7654 MARTIN
    7698 BLAKE
          15 개의 행이 선택되었습니다.

                                                                                                                                      
** 동의어 삭제 **

SQL> DROP SYNONYM scott_emp;
시노님이 삭제 되었습니다.

SQL> SELECT empno, ename FROM scott_emp;
라인 1에 오류:
ORA - 00942 : 테이블 또는 뷰가 존재하지 않습니다.

                                                                                                                                      
[출처] 9. 오라클 객체(4) [SYNONYM]|작성자 요요



------------------------------------------------------------------------------------------------------------
뽀나스

oracle 다른 계정에서 synonym이나 username 지정 없이 table query 하기.


대부분의 오라클 운영자는 '/as sysdba' 나 system 계정으로 작업을 합니다.
모니터링 중 특정 user에서 대해 수행되는 sql의 이상 등을 발견하는 경우 가끔 해당 sql을 직접 수행해 보는 경우가 있는데, v$sqltext 등에서 잡아온 sql을 그대로 수행하면 에러가 당연히 발생합니다.

해당 sql의 table list가 몇개 안될 경우 table 명 앞에 username을 지정하면, 수행은 가능하지만 귀찮기도 하고 어찌되었던 sql이 변경되 버리고 말죠.

또 다른 sql에서 권한이 있는 table을 수행할 경우에도 table의 각각의 username을 설정해야 합니다.
그게 아니라면 synonym을 따로 만들어 줘야 합니다.

이러한 경우 간단히 CURRENT_SCHEMA의 설정으로 이 모든 귀찮은 것을 해결할 수 있습니다.
CURRENT_SCHEMA는 현재 수행되는 SCHEMA환경을 지정한 SCHEMA로 변경해 줍니다.



SQL> CONNECT SCOTT/TIGER;
SQL> GRANT SELECT ON EMP TO JAMES;
SQL> CONNECT JAMES/TIGER;
SQL> SELECT COUNT(*) FROM SCOTT.EMP;
SQL> SELECT COUNT(*) FROM EMP;

SELECT COUNT(*) FROM EMP
                                       *
ERROR at line 1:
ORA-00942: table or view does not exist


위의 경우 당연히 에러가 발생하게 됩니다.
그러면 synonym이나 username을 추가 지정없이 수행하려면 다음의 CURRENT_SCHEMA를 SCOTT으로 지정해 줍니다.


SQL> CONNECT JAMES;
SQL> ALTER SESSION SET CURRENT_SCHEMA=SCOTT;
Session altered.

SQL> SELECT COUNT(*) FROM EMP;
COUNT(*)
10
...

출처: http://energ.tistory.com/141

방장은 누규? 채팅사이트 조이팅스토리를 운영하며 마케팅, 사업 등에 관심이 많은 철이


---------------------------------------------------------------------------------------------------------------
뽀나스

mom이라는 사용자의
A, B, C 라는 테이블을 사용하기 위해

다른 사용자들은 mom.A, mom.B 등으로 사용하는데

A, B 로 바로 쓸수 있게 하는

synonym을 일괄 생성하는 방법

================
sqlplus 로 접속해서

 spool make_synonyms.sql
SELECT 'create public synonym ' || table_name || ' for ' || table_name || ';'
  FROM user_tables;
spool off

@make_synonyms

================

다른 방법은 current schema를 쓰는 방법

alter session set current_schema=scott;

==================

USER_B에게 USER_A.sample의 select 권한 부여
GRANT SELECT ON USER_A.sample_table TO USER_B;



http://www.dude.co.kr




P 이경철님의 파란블로그에서 발행된 글입니다.

댓글 없음:

댓글 쓰기