오라클에서는 멀티테넌트 아키텍처라는 개념을 사용하기 때문에 계정 유형에 대한 이해가 필요하다.
멀티테넌트 개념은 오라클 멀티테넌트 DB 기본개념 정리 (Oracle Multi-Tenant DB Basics)를 읽어보는 것을 추천한다.
예시: SYS, SYSTEM
목적: 데이터베이스 전체를 관리하는 데 사용되는 계정으로, 데이터베이스 인스턴스의 생성과 설정, 모든 유저의 관리, 중요 시스템 테이블 및 뷰의 접근과 수정이 가능
권한: 가장 높은 수준의 권한을 가지며, 데이터베이스 관련 거의 모든 작업을 수행 가능
예시: C##USERNAME
목적: 멀티테넌트 아키텍처에서 사용되며, 하나의 공통 사용자가 여러 플러그 가능 데이터베이스(PDB)에 접근하여 작업을 수행 가능
권한: CONTAINER=ALL을 사용하면 CDB 전체에 걸쳐 권한을 가질 수 있으며, 이는 다수의 PDB에서 작업이 가능
목적: 특정 데이터베이스 또는 애플리케이션의 데이터 관리를 위해 생성되며, 이 사용자들은 자신들의 데이터베이스 객체(테이블, 뷰 등)에 대한 작업만 수행
권한: 생성 시 지정된 권한에 따라 제한됩니다. 일반적으로 자신이 소유하거나 접근 권한이 부여된 객체에만 작업이 가능
전 글에서 작성했던 오라클 컨테이너 설치에서는 슈퍼유저 계정으로 로그인하고 테이블을 출력하는 것 까지 했다. 슈퍼유저 계정은 오라클 데이터베이스의 운영과 관리를 위해 시스템이 자동으로 생성하고 관리하는 시스템 테이블까지 건드릴 수 있기 때문에 관리 및 개발 작업에서 실수로 중요한 시스템 테이블을 수정하거나 삭제할 위험이 있어서 실습이나 개발을 진행할 때에 로그인해서 데이터베이스를 생성할 때 권장되는 방법이 아니라고 한다.
따라서, 우리는 사용자가 특정 데이터를 저장하기 위해 생성한 테이블인 사용자 정의 테이블을 안전하게 생성하려면 따로 유저 계정을 만들어 줘야 한다. 교육이나 실습 환경에서 멀티테넌트 아키텍처의 이해와 활용을 위해 공통 사용자 계정으로 만드는 것이 권장된다고 한다.
도커 오라클 컨테이너를 실행하고, 먼저 system 슈퍼 유저 계정에 로그인 해서 sqlplus를 터미널에 띄운다.
CREATE USER C##danee IDENTIFIED BY password CONTAINER=ALL;
User created. 가 뜨면 성공
C##은 공통사용자를 나타내는 접두사IDENTIFIED BY는 비밀번호 설정 시 필요한 옵션CONTAINER=ALL은 이 사용자에게 CDB 전체에서 권한을 부여해서 사용자가 모든 PDB에 대해 관리할 수 있도록 함GRANT CONNECT, RESOURCE TO C##danee CONTAINER=ALL;
GRANT DROP ANY TABLE TO C##danee CONTAINER=ALL;
GRANT CREATE VIEW TO C##danee;
Grant succeeded. 가 뜨면 성공
CONNECT 는 사용자가 데이터베이스에 연결 및 로그인 할 수 있는 권한을 제공RESOURCE 는 사용자가 테이블, 인덱스, 시퀀스 등을 생성할 수 있는 권한을 제공DROP ANY TABLE은 사용자가 자신이 만든 모든 테이블을 삭제할 수 있는 권한을 제공ALTER USER C##danee QUOTA UNLIMITED ON USERS;
테이블스페이스 (Tablespace): 테이블스페이스는 데이터 저장공간이라고 생각하면 되며, USERS 테이블스페이스는 일반적으로 사용자 데이터를 위해 사용되고 데이터베이스 설치 시 기본적으로 생성쿼터 (Quota): 테이블스페이스에 저장될 수 있는 데이터의 양을 제한하기 위해 사용자별로 설정할 수 있으며, 데이터베이스 관리자에 의해 ALTER USER 명령을 사용하여 설정 된다. 위는 제한 없이 데이터를 저장할 수 있는 UNLIMITED를 사용함잘못 만들었을 때만 사용, 이미 만들어진 데이터베이스가 있으면 잘 처리하고 삭제해야 함
DROP USER C##danee CASCADE;
User dropped. 가 뜨면 성공
이제 exit을 통해 슈퍼유저 계정에서 로그아웃 하고 다시 위에 생성한 공통 사용자 계정으로 로그인한다.
docker exec -it oracle sqlplus #sqlplus 실행
select * from tab;
모든 테이블 출력을 했을 때 이제 슈퍼유저 계정으로 출력했을 때와 달리 no rows selected가 뜰 것이다. 실습 준비 끝!
sqlplus는 명령 인터페이스지 편집기가 아니다. 따라서 스크립트 파일 생성은 불가하다. 따라서 우리는 SQL명령어를 SQL Developr라는 오라클에서 만든 IDE에서 사용하고, 출력 파일을 만들 것이다.
우리는 arm64 아키텍처라 JAVA기반으로 만든 SQL Developer를 사용하기 위해선 JDK라는 패키지를 먼저 설치해주고 SQL Developer를 사용하는 것이 좋다고 한다.
- JDK 패키지 다운로드 여기서 DMG파일로 다운받은 후 패키지 클릭 후 설치
- Oracle SQL Developer 다운로드
만약 무한로딩이 생기면 [Mac OS] SQL Developer 무한 로딩 이 포스트를 참고
이름, 아까 생성했던 공용계정을 이용해 로그인한다.
CREATE TABLE firstTable
(id CHAR(10) primery key,
name VARCHAR(30),
height NUMRIC(4,1)
);
위의 테이블은 번호, 이름, 키를 받는 테이블이다.
char: 고정 길이 문자 데이터 유형으로 지정된 길이에 도달하지 않는 데이터를 저장할 때, 나머지 공간은 공백으로 채워짐. 위는 primery key를 '1'로 받으면 1과 함께 나머지 공백9개와 함께 저장 됨VARCHAR: 가변 길이 문자 데이터 유형으로 저장된 데이터는 실제 길이만큼만 공간을 차지하고, 나머지 공간은 사용하지 않음. 위는 VARCHAR(30)에 'Kim'을 저장하면, 실제 저장 공간은 'Kim'만 사용하고 추가 공간은 낭비하지 않음numric: 고정 및 부동 소수점 숫자를 저장하며, 위의 NUMRIC(4,1)은 최대 4자리 숫자를 저장할 수 있으며 그 중 한 자리는 소수점 이하 자릿수로 사용INSERT INTO firstTable VALUES ('1', 'Kim', 185.3);
INSERT INTO firstTable VALUES ('2', 'Lee', 190.5);
INSERT INTO firstTable VALUES ('3', 'Park', 200.2);
SELECT * FROM firstTable;
*는 보통 '모든'을 뜻함SQL> SELECT * FROM firstTable;
ID NAME HEIGHT
------------- ------------------------------ ----------
1 Kim 185.3
2 Lee 190.5
3 Park 200.2
SQL Developer에서 스크립트 칸의 저장과 좌측 상단의 저장을 누르면 스크립트와 출력 파일 저장이 가능하다.
객체 삭제
-- fistTable을 휴지통으로 이동
DROP TABLE fistTable;
-- 휴지통 완전히 비우기
PURGE RECYCLEBIN;
막대 메뉴에서 하고있던 작업을 모두 저장한다.
우클릭 시 접속 해제가 뜨므로 클릭한다.