Oracle 계정 생성
오라클에서 계정을 생성해 보자. 오라클에서 계정 생성은 다른 데이터베이스와는 완전히 다른 의미를 갖는다. 보통 데이터베이스의 계정은 데이터베이스에 접속을 하기 위한 목적만 가진다. 하지만 오라클 데이터베이스의 계정은 이와는 다르다.
스키마(Schema)
오라클에서 스키마는 데이터베이스 오브젝트(Object)들의 모음이다. 오브젝트라고 하면 테이블(Table), 뷰(View) 와 같은 것을 말한다.
이론적으로 데이터베이스에 의해서 사용되어지는 메타데이터의 집합이라고도 한다. 하나의 스키마는 테이블, 컬럼, 속성등과 같은 데이터베이스의 애튜리브트(Attribute) 를 정의한다.
그래서 데이터베이스는 이러한 스키마들을 관리해주는 시스템이라고 보면 된다.
스키마의 존재 이유는 데이터의 모음을 그룹화하고 권한 설정을 하는데 있다. 오라클은 관계형 데이터베이스이기 때문에 테이블이나 뷰의 경우에 다른 오브젝트와 간계를 맺고 있어 그룹으로 한데 모아 관리하는게 유리 하다.
데이터베이스에는 다수의 스키마들이 있게 된다.
사용자 계정(Account)
데이터베이스 시스템에 접속하기 위해서 필요한 것이 사용자 계정이다. 계정이 없으면 데이터베이스 시스템에 접속할 수 없다는건 당연한 것이다. 두번째는 데이터베이스 오브젝트에 접근하는 것이다. 오브젝트에 대한 접근은 GRANT 명령어를 사용해서 권한을 할당 받는 방법을 쓴다.
오브젝트는 그룹으로 묶어서 관리하는 스키마(Schema) 가 있기 때문에 이 스키마에 대한 권한을 설정하면 데이터베이스 접속 계정으로 오브젝트들을 만질 수 있게 된다.
오라클 계정과 스키마
오라클을 사용하다보면 은근히 많이 헷깔리는게 사용자 계정과 스키마다. 정확하게는 스키마 생성 = 오라클 계정 생성으로 되기 때문에 스키마가 곧 데이터베이스 계정과 같다는 착각을 하게 된다.
정확하게 말하면, 정확하게는 이론적으로 말하면 데이터베이스 계정과 스키마는 완전히 상관이 없는 내용이다. 앞서 내용을 읽어보면 이해가 될 것이다.
하지만 오라클은 계정을 생성하게되면 기본적으로 계정 ID 와 동일한 스키마가 자동으로 생성된다. 그래서 오라클 공식문서를 읽어봐도 스키마 생성을 위한 명령어는 ‘CREATE USER’ 가 된다. 그리고 관리자에게 권한을 주는 명령어 GRANT 명령어는 당연히 계정과 똑같은 이름으로 생성된 스키마에 부여 된다.
참고로 PostgreSQL 은 사용자 계정과 스키마는 완전히 분리된 구조를 가진다. 사용자 계정은 그야말로 데이터베이스 접속 권한이고 ROLE 를 이용해서 데이터베이스 접근 권한을 부여한다. PostgreSQL 에서 데이터베이스를 생성하면 기본 스키마 Public 이 생성된다. 만일 스키마가 더 필요하다면 특정 데이터베이스에서 스키마를 생성하면 된다. 그러니까 PostgreSQL 은 데이터베이스 내에 스키마를 여러개 가질 수 있으며 이 스키마 별로 사용자 계정에 권한을 부여할 수 있게 된다.
다중테넌트 오라클 데이터베이스 계정 생성
CDB, PDB 구조를 가지게 된 오라클에서 계정 생성은 이전과는 달라졌다. CDB 계정 생성과 non-CDB 계정 생성을 위한 사용자 계정 네이밍 규칙이 생성된 것이다.
CDB 사용자들을 일반 사용자(Common User), PDB 계정들을 로컬 사용자(Local User) 라고 한다.
non-CDB 사용자의 경우에 계정명은 C## 혹은 c## 로 시작되면 안된다. CDB 사용자의 경우에 사용자 계정명의 요구사항은 다음과 같다.
- 오라클 데이터베이스 12c Release 1 (12.1.0.1), 일반 사용자(Common User) 는 반드시 COMMON_USER_PREFIX 초기화 파라메터에서 정의한 프리픽스로 시작해야 한다. 기본 프리픽스는 C## 이다.
- 로컬 사용자(Local User) 의 경우에는 COMMON_USER_PREFIX 초기화 파라메터에서 정의한 프리픽스로 시작해서는 안된다. COMMON_USER_PREFIX 와 상관없이 로컬 사용자는 C## 이나 c## 로 시작할 수 없다.
CONTAINER = ALL, CONTAINER = CURRENT
다중테넌트 상황에서 계정 생성시에 CONTAINER 구문을 사용할 수 있다. CONTAINER = ALL 은 반드시 root 사용자여야 하며, CONTAINER=CURRENT 은 반드시 PDB 여야 한다.
PDB 계정 생성
다중테넌트에서 사용자 계정은 PDB 에서 생성을 하게 된다. 이제 계정을 생성해 보자.
1 2 3 4 5 6 7 8 9 10 11 |
]$ sql / as sysdba SQLcl: Release 19.1 Production on Sat May 08 19:20:45 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> set sqlformat ansiconsole; |
“set sqlformat ansiconsole” 은 출력 포멧을 안시콘솔 형식에 맞추라는 것이다. 나름 출력을 깔끔하게 해준다.
최고관리자로 접속을 하였기 때문에 일반 계정을 생성하기 위해서는 PDB 로 변경해주는 것이 좋다.
1 2 3 4 5 6 7 8 9 10 11 |
SQL> SHOW USER; USER is "SYS" SQL> ALTER SESSION SET CONTAINER=pdb1; Session altered. SQL> SHOW con_id; CON_ID ------------------------------ 3 SQL> |
이제 일반 사용자를 위한 테이블 스페이스를 할당해야 한다. PDB 를 생성하면서 생성된 기본 테이블스페이스를 사용하돌고 하자. 다음과 같이 PDB 의 테이블스페이스를 조회해 볼 수 있다.
1 2 3 4 5 6 7 8 9 |
SQL> SELECT * FROM v$tablespace; TS# NAME INC BIG FLA ENC CON_ID ---------- ------------------------------ --- --- --- --- ---------- 0 SYSTEM YES NO YES 3 1 SYSAUX YES NO YES 3 2 UNDOTBS1 YES NO YES 3 3 TEMP NO NO YES 3 5 USERS YES NO YES 3 |
사용자를 위한 테이블스페이스 USERS 를 사용하고, 임시 테이블스페이스는 TEMP 를 이용하면 된다. 필요한 정보는 다 모았으니 다음과 같이 사용자 계정을 생성한다.
1 2 3 4 5 6 7 8 9 |
SQL> CREATE USER sidney IDENTIFIED BY out_standing1 DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK CONTAINER=CURRENT; User created. |
사용자 생성을 완료 했다. 오라클은 사용자 계정을 생성하면 사용자 계정과 똑같은 이름으로 스키마를 함께 생성시켜준다. 그리고 그 스키마에 대한 권한을 사용자 계정이 갖도록 해준다.
오라클은 사용자 계정을 생성했다고 해서 자동으로 로그인이 되도록해주지 않는다. 이 계정은 데이터베이스에 접속하기 위한 계정인데, 로그인 권한을 부여해 줘야 한다. 로그인 권한은 “CREATE SESSION” 이다.
1 2 3 4 5 |
SQL> GRANT CONNECT TO sidney; Grant succeeded. SQL> |
계정이 생성이 되었다. 이제 접속이 잘 되는지 다음과 같이 테스트를 진행해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 |
]$ sql sidney/out_standing1@oradb1.systemv.local:1521/pdb1 SQLcl: Release 19.1 Production on Sat May 08 19:34:12 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> |
접속을 Alias 를 이용하기 위해서는 tnsnames.ora 파일에 다음과 같이 내용을 추가해 준다.
1 2 3 4 5 6 7 8 9 10 |
]$ vim $ORACLE_HOME/network/admin/tnsnames.ora SIDNEY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1.systemv.local)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1) ) ) ]$ tnslsnr reload |
여기서 SERVICE_NAME=pdb1 은 다음과 같이 확인이 가능하다.
1 2 3 4 5 6 7 |
SQL> SELECT name, network_name, con_id from V$ACTIVE_SERVICES; NAME NETWORK_NAME CON_ID o19cXDB o19cXDB 1 SYS$BACKGROUND 1 SYS$USERS 1 pdb1 pdb1 3 o19c o19c 1 |
NAME 에 pdb1 이 보인다. CON_ID 가 3이 PDB 임을 말해주고 있다.
다음과 같이 Alias 로 접속이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 |
]$ sql sidney/out_standing1@SIDNEY SQLcl: Release 19.1 Production on Sat May 08 20:01:23 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> |