/*- 12_시스템 권한.sql -*/

/*
 * # 데이터베이스 보안을 위한 권한
 * - 시스템 권한, 객체 권한 두 가지 종류.
 *   
 * # 시스템 권한
 * - 사용자 생성과 제거, DB 접근 및 여러가지 객체를 생성할 수 있는 권한 등으로 주로 DBA에 의해 부여됌.
 *   
 * # 객체 권한
 * - 테이블, 뷰 등의 객체
 */
 
 /*
  * # 사용자 생성
  * - 사용자 계정을 생성하기 위해서는 시스템 권한을 가진 system으로 접속해야함.
  *   CREATE USER '사용자 이름'
  *   INDENTIFIED BY '사용자 암호'
  *   [ WITH ADMIN OPTION ];
  */

-- SYSTEM 계정 연결

-- TEST 계정 생성
CREATE USER TEST IDENTIFIED BY test1234;

-- 생성된 계정 목록 확인
SELECT * FROM ALL_USERS;
/*- 12_시스템권한_SYSTEM -*/

-- TEST 계정 생성
CREATE USER TEST IDENTIFIED BY test1234;

-- 생성된 계정 목록 확인
SELECT * FROM ALL_USERS;

-- CREATE SESSION : 데이터베이스에 접속할 수 있는 권한.
GRANT CREATE SESSION TO TEST;

/* QUIZ */
-- DBTEST_A 계정을 생성하고, 기본 2개의 롤 권한( CONNECT, RESOURCE )을 부여.
-- > 1. 계정 생성
--   2. 생성된 계정에 권한 부여
--   3. ALTER USER 계정명 DEFAULT TABLESPACE USERS; -> 데이터베이스 저장되는 공간 지정
--   4. ALTER USER 계정명 QUOTA UNLIMITED ON USERS; -> tablespace 용량 지정

CREATE USER DBTEST_A IDENTIFIED BY 1234;
SELECT * FROM ALL_USERS;
GRANT CONNECT, RESOURCE TO DBTEST_A;

ALTER USER DBTEST_A DEFAULT TABLESPACE USERS;
ALTER USER DBTEST_A QUOTA UNLIMITED ON USERS;

-- DBTEST_A 계정에 회원 정보를 관리하는 MEMBER 테이블을 생성.
-- > SEQ        - 회원수 : 시퀀스 적용
--   ID(30)     - 회원 ID : 중복 X, NULL 값 사용 불가
--   NAME(30)   - 회원 이름 : NULL 값 사용 불가
--   AGE(3)     - 회원 나이
--   HEIGHT     - 회원 키  : 전체 10자리, 소수점 2번째 자리까지 가능
--   LOGTIME    - 생성일자
CREATE TABLE DBTEST_A.MEMBER(
SEQ NUMBER(2) NOT NULL,
ID VARCHAR2(30) CONSTRAINT PK_ID PRIMARY KEY,
NAME VARCHAR2(30) CONSTRAINT NN_NAME NOT NULL,
AGE NUMBER(3),
HEIGHT NUMBER(10,2), 
LOGTIME DATE
);

DESC DBTEST_A.MEMBER;
SELECT * FROM DBTEST_A.MEMBER;
-- MEMBER 테이블에 데이터 추가, 삭제
CREATE SEQUENCE DBTEST_A.MEMBER_SEQ START WITH 1 INCREMENT BY 1 MAXVALUE 100 NOCACHE NOCYCLE;
INSERT INTO DBTEST_A.MEMBER VALUES (DBTEST_A.MEMBER_SEQ.NEXTVAL, 'id1', 'kimdusik', 40, 180.42, SYSDATE);
INSERT INTO DBTEST_A.MEMBER VALUES (DBTEST_A.MEMBER_SEQ.NEXTVAL, 'id2', 'jangjuwon', 45, 175.422, SYSDATE);
DELETE FROM DBTEST_A.MEMBER WHERE ID='id2';
-- MEMBER 테이블 삭제 
DROP TABLE DBTEST_A.MEMBER PURGE;
DROP SEQUENCE DBTEST_A.MEMBER_SEQ;
-- DBTEST_A 계정 삭제 
DROP USER DBTEST_A CASCADE;
SELECT * FROM ALL_USERS;