오늘은 지난 주에 생성한 DB에 계정을 생성하는 방법을 알아보자.
Oracle 11g XE 설치 방법은 http://sarc.io/index.php/oracledatabase/506-linux-oracle-database-11g-express-edition-oracle-xe-11-2-0-1-0-x86-64 에 정리하였다. 참고바란다.
이어지는 작업은 SQL*Plus 툴 상에서 실행한다.
요청사항 : 1반의 9명의 학생에게 계정을 만들어주시오.
이제 만들 계정 이름은 class1_user{X}, 즉 class1_user1부터 class1_user9까지이다. 그런데 계정을 만드려면 계정마다 Default Tablespace를 지정해야 한다. 현재 어떠한 Tablespace가 있는지 확인해 보자.
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES; TABLESPACE_NAME ------------------------------ SYSTEM SYSAUX UNDOTBS1 TEMP USERS
아무래도 각 계정별로 Tablespace를 따로 만드는 것이 좋을 것 같다.
- 만들 Tablespace의 이름은 ts_class1_user{X}로 정했다. 즉 ts_class1_user1부터 ts_class1_user9까지이다.
- Tablespace는 /u01/app/oracle/oradata/CLASS1 아래에 저장시키려고 한다.
- 그리고 이 Tablespace들은 automatic segment-space management 방식으로 만드려고 한다.
그렇다면 보통 이렇게 만들게 될 것이다.
CREATE TABLESPACE ts_class1_user1 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user1.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
그런데 만들 사용자가 총 9명이다. CREATE TABLESPACE문을 9줄 만들어서 user1부분을 다 수정해야 하는데.. 좀 더 스마트하게 처리해 보자.
아래는 자작 SQL이다. cr_tbs9.sql라고 이름 붙였다.
SET serveroutput ON BEGIN FOR seq IN 1..9 loop dbms_output.put_line('CREATE TABLESPACE ts_class1_user'||to_char(seq)||chr(10)||' DATAFILE ''/u01/app/oracle/oradata/CLASS1/ts_class1_user'||to_char(seq)||'.dbf'' SIZE 10M'||chr(10)||' EXTENT MANAGEMENT LOCAL'||CHR(10)||' SEGMENT SPACE MANAGEMENT AUTO;'); END loop; END; /
돌려보자!
SQL> @cr_tbs9.sql CREATE TABLESPACE ts_class1_user1 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user1.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user2 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user2.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user3 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user3.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user4 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user4.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user5 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user5.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user6 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user6.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user7 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user7.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user8 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user8.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TABLESPACE ts_class1_user9 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user9.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; PL/SQL procedure successfully completed.
아시겠지만 위 작업은 실제 Tablespace를 만들어주는 작업이 아니고 Tablespace를 만들기 위한 스크립트를 뽑아주는 것 뿐이다. 저기 나온 CREATE TABLESPACE들을 긁어서 실행하면 비로소 Tablespace 9개가 생성될 것이다.
시작한 김에 아래와 같이 좀 더 손을 보자.
SET heading off SET echo off SET term off SET feedback off SET pagesize 150 SET pagesize 500 spool cr_user9_result.SQL SET serveroutput ON BEGIN FOR seq IN 1..9 loop dbms_output.put_line(chr(10)||'// Create Tablespace'); dbms_output.put_line('CREATE TABLESPACE ts_class1_user'||to_char(seq)||chr(10)||' DATAFILE ''/u01/app/oracle/oradata/CLASS1/ts_class1_user'||to_char(seq)||'.dbf'' SIZE 10M'||chr(10)||' EXTENT MANAGEMENT LOCAL'||CHR(10)||' SEGMENT SPACE MANAGEMENT AUTO;'); dbms_output.put_line('// Create User'); dbms_output.put_line('CREATE USER class1_user'||to_char(seq)||chr(10)||' IDENTIFIED BY oracle'||to_char(seq)||chr(10)||' DEFAULT TABLESPACE ts_class1_user'||to_char(seq)||chr(10)||' TEMPORARY TABLESPACE temp;'); dbms_output.put_line('// Grant Privilge'); dbms_output.put_line('GRANT CONNECT, RESOURCE TO class1_user'||to_char(seq)||';'); END loop; END; / spool off
이제 위 SQL을 실행해 보자.
SQL> @cr_user9.sql SQL>
아무 반응이 없는 것 같지만, 아래와 같은 cr_user9_result.sql라는 파일이 생성된다.
// Create Tablespace CREATE TABLESPACE ts_class1_user1 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user1.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; // Create User CREATE USER class1_user1 IDENTIFIED BY oracle1 DEFAULT TABLESPACE ts_class1_user1 TEMPORARY TABLESPACE temp; // Grant Privilge GRANT CONNECT, RESOURCE TO class1_user1; // Create Tablespace CREATE TABLESPACE ts_class1_user2 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user2.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; // Create User CREATE USER class1_user2 IDENTIFIED BY oracle2 DEFAULT TABLESPACE ts_class1_user2 TEMPORARY TABLESPACE temp; // Grant Privilge GRANT CONNECT, RESOURCE TO class1_user2; (중간생략) // Create Tablespace CREATE TABLESPACE ts_class1_user8 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user8.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; // Create User CREATE USER class1_user8 IDENTIFIED BY oracle8 DEFAULT TABLESPACE ts_class1_user8 TEMPORARY TABLESPACE temp; // Grant Privilge GRANT CONNECT, RESOURCE TO class1_user8; // Create Tablespace CREATE TABLESPACE ts_class1_user9 DATAFILE '/u01/app/oracle/oradata/CLASS1/ts_class1_user9.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; // Create User CREATE USER class1_user9 IDENTIFIED BY oracle9 DEFAULT TABLESPACE ts_class1_user9 TEMPORARY TABLESPACE temp; // Grant Privilge GRANT CONNECT, RESOURCE TO class1_user9;
그럼 지금 막 생성된 cr_user9_result.sql을 실행해 보자.
SQL> @cr_user9_result.sql SQL>
모든 작업이 잘 완료되었을지 확인해 보자. 먼저 Tablespace 생성 여부다.
SQL> SELECT FILE_NAME, TABLESPACE_NAME FROM DBA_DATA_FILES; FILE_NAME TABLESPACE_NAME ------------------------------------------------------------ --------------- /u01/app/oracle/oradata/XE/users.dbf USERS /u01/app/oracle/oradata/XE/sysaux.dbf SYSAUX /u01/app/oracle/oradata/XE/undotbs1.dbf UNDOTBS1 /u01/app/oracle/oradata/XE/system.dbf SYSTEM /u01/app/oracle/oradata/CLASS1/ts_class1_user1.dbf TS_CLASS1_USER1 /u01/app/oracle/oradata/CLASS1/ts_class1_user2.dbf TS_CLASS1_USER2 /u01/app/oracle/oradata/CLASS1/ts_class1_user3.dbf TS_CLASS1_USER3 /u01/app/oracle/oradata/CLASS1/ts_class1_user4.dbf TS_CLASS1_USER4 /u01/app/oracle/oradata/CLASS1/ts_class1_user5.dbf TS_CLASS1_USER5 /u01/app/oracle/oradata/CLASS1/ts_class1_user6.dbf TS_CLASS1_USER6 /u01/app/oracle/oradata/CLASS1/ts_class1_user7.dbf TS_CLASS1_USER7 /u01/app/oracle/oradata/CLASS1/ts_class1_user8.dbf TS_CLASS1_USER8 /u01/app/oracle/oradata/CLASS1/ts_class1_user9.dbf TS_CLASS1_USER9
9개의 새로운 Tablespace가 잘 생성되었다. 다음은 계정이다.
SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TO_CHAR(CREATED, 'YYYY-MM-DD') CREATED FROM DBA_USERS; USERNAME DEFAULT_TABLESPACE CREATED ------------------------------ ------------------------------ ---------- SYS SYSTEM 2011-08-28 SYSTEM SYSTEM 2011-08-28 ANONYMOUS SYSAUX 2011-08-28 CLASS1_USER1 TS_CLASS1_USER1 2016-07-02 CLASS1_USER2 TS_CLASS1_USER2 2016-07-02 CLASS1_USER3 TS_CLASS1_USER3 2016-07-02 CLASS1_USER4 TS_CLASS1_USER4 2016-07-02 CLASS1_USER5 TS_CLASS1_USER5 2016-07-02 CLASS1_USER6 TS_CLASS1_USER6 2016-07-02 CLASS1_USER7 TS_CLASS1_USER7 2016-07-02 CLASS1_USER8 TS_CLASS1_USER8 2016-07-02 CLASS1_USER9 TS_CLASS1_USER9 2016-07-02 APEX_PUBLIC_USER SYSTEM 2011-08-28 APEX_040000 SYSAUX 2011-08-28 OUTLN SYSTEM 2011-08-28 XS$NULL SYSTEM 2011-08-28 FLOWS_FILES SYSAUX 2011-08-28 MDSYS SYSAUX 2011-08-28 CTXSYS SYSAUX 2011-08-28 XDB SYSAUX 2011-08-28 HR USERS 2011-08-28
2016년 7월 2일에 생성된 9개의 계정이 잘 확인되었다.
이제 마지막으로 계정 접속 테스트를 해보자.
SQL> CONNECT CLASS1_USER1/ORACLE1 ERROR: ORA-01017: invalid username/password; logon denied
하지만 접속에 실패하였다. 이유는 패스워드 대소문자 구별 때문이다.
SQL> CONNECT CLASS1_USER1/oracle1 Connected.
소문자로 해서 잘 되는 것을 확인하였다.
위와 같이 계정 생성 방법을 알아보았다.