티스토리 뷰

-- ------------------------------------------------------
-- 1. DDL (Data Definition Language) - 테이블을 만들때 사용한다.
-- ------------------------------------------------------
-- 데이터베이스 구조(= 오라클(DB) 객체)를 생성/수정/삭제하는데,
-- 사용하는 SQL문장.
-- ------------------------------------------------------
-- 가. 자동으로 COMMIT 됨. (즉, DB에 자동 영구 반영됨) (**)
-- 나. 데이터 딕셔너리(Data Dictionary) 에 정보 저장.
-- ------------------------------------------------------
-- 다. 오라클 객체(= 데이터베이스 구조)의 종류(크게 5가지)
-- ------------------------------------------------------
--  (1) 테이블(Table) - 목표 : 데이터 저장
--      기본적인 데이터 저장 단위로, 행과 열로 구성된 객체
--  (2) 인덱스(Index) - 목표 : 데이터 검색성능 향상 (***)
--      테이블에 저장된 데이터의 검색 성능 향상 목적을 위한 객체
--  (3) 뷰(View) - 목표 : 가상의 테이블
--      한 개 이상의 테이블의 논리적인 부분 집합을 표시할 수 있는 객체
--  (4) 시퀀스(Sequence) - 목표 : 순차번호 생성기 (인조키, 대리키)
--      테이블의 특정 컬럼값에 숫자 값 자동 생성 목적을 위한 객체
--  (5) 동의어(Synonym) - 목표 : 테이블의 별칭
--      객체에 대한 동의어를 설정하기 위한 객체
-- ------------------------------------------------------
-- 라. SQL문장 종류
-- ------------------------------------------------------
--  (1) CREATE    - DB객체(= Oracle 객체) 생성
--  (2) ALTER     - DB객체(= Oracle 객체) 변경
--  (3) DROP      - DB객체(= Oracle 객체) 삭제
--  (4) RENAME    - DB객체(= Oracle 객체) 이름 변경
--  (5) TRUNCATE  - DB객체(= Oracle 객체) 정보 절삭 (데이터 완전 삭제 - 복구 불가능)

-- + DELETE는 복구가 가능하다.
-- ------------------------------------------------------


-- ------------------------------------------------------
-- (1) Table 생성
-- ------------------------------------------------------
--  가. DB에서 가장 중요한 객체
--  나. 관리할 실제 데이터를 저장하는 객체
--  다. 이름은 의미있고 사용하기 쉽게 설정하는 것이 중요
-- ------------------------------------------------------
-- Basic Syntax:

--  CREATE TABLE [스키마].테이블명 (
--       컬럼명  데이터타입  [DEFAULT 값 | 제약조건][,
--          ... ]
--  );
-- ------------------------------------------------------

-- ------------------------------------------------------
--  * 스키마(Schema) ( = 계정 스키마 )
-- ------------------------------------------------------
--  가. 사용자가 DB에 접근하여, 생성한 객체들의 대표이름!!
--  나. By default, 사용자 계정명과 동일하게 부여됨!! (ex. HR, SCOTT)
--  다. 생성한 객체들의 소유자는 해당 객체를 생성한 사용자 계정
--  라. 다른 스키마에 속한 객체 접근은 기본적으로 불가 (접근권한필요) (**)
--  마. 만일 다른 스키마 내의 객체에 대한 접근권한이 있다면,
--      항상 "스키마.객체" 형식으로 사용해야 됨. (*)
--      "스키마"를 생략하면, 현재 자신의 스키마 내에서 객체 찾음
--  바. 자신의 스키마 내의 객체 접근 시에는, 스키마 이름 생략가능 (*)
-- ------------------------------------------------------

SELECT
    deptno,
    dname,
    loc
FROM
    SCOTT.dept;
-- SCOTT계정 밑에 있는 dept 테이블을 조회할 수 있다. (하지만 다른 계정에서는 접근권한이 필요하기에 안된다.) (**)


-- ------------------------------------------------------
--  * Oracle Data Types (컬럼에 저장되는 데이터의 자료형) (***)
-- ------------------------------------------------------
--  (1) CHAR(size)      - 고정길이 문자저장 (1<= size <= 2000, byte)
--      a. 지정길이보다 작은 데이터 입력 -> 나머지 공간은 공백으로 채워짐
--      b. 입력할 데이터 크기가 유동적 -> 공간낭비 초래
--      c. 고정크기 데이터 저장에 사용 -> ex. 주민번호, 우편번호, 전화번호,...
--  (2) VARCHAR2(size)  - 가변길이 문자저장 (1<= size <= 4000, byte)
--      a. 지정길이보다 작은 데이터 입력 -> 입력문자열 길이만큼만 공간할당 (**)
--      b. 저장공간을 매우 효율적으로 사용가능
--  (3) NVARCHAR2(size) - 가변길이 문자저장 (1<= size <= 4000, byte)
--  (4) NUMBER(p, s)    - 가변길이 숫자저장 (p: 소수점자릿수, S: 전체자릿수 - 자릿수는 정수로 표현) (**)
--      a. p: precision (정밀도), s: scale (스케일)
--  (5) DATE            - 날짜 및 시간 저장
--  (6) ROWID           - 테이블 행의 고유주소(18문자로 구성) 저장 (*)
--      a. 테이블에 실제 행이 저장되어 있는 논리적인 주소값
--      b. globally Unique value in the database
--      c. 테이블에 새로운 행이 삽입되면, 자동생성됨
--      d. 인덱스(Index) 내에 저장된 데이터임
--         실제 행이 저장된 주소값을 직접 알 수 있기 때문에, 검색속도가 빠르게 됨.
--      e. 문자구성(*) (- 일정한 체계를 가지고 있음)
--         | 테이블객체 번호(6자리) | 파일 번호(3자리) | 블록 번호(6자리) | 행 번호(3자리) |
--  (7) BLOB            - 대용량 이진데이터 저장 (최대 4GB)
--      a. LOB == Large OBject (3가지: BLOB, CLOB, BFILE)
--      b. 대용량의 텍스트/바이너리 데이터 저장 (ex, 이미지, 동영상, 사운드 데이터)
--  (8) CLOB            - 대용량 텍스트데이터 저장 (최대 4GB)
--      a. 대용량의 텍스트 데이터 저장(ex, e-book)
--  (9) BFILE           - 대용량 이진데이터를 파일형태로 저장 (최대 4GB)

-- + 개발자의 경우 주로 (1) ~ (6)까지가 자주 사용된다.
-- ------------------------------------------------------

SELECT
    rowid,
    deptno
FROM
    dept;
-- rowid를 통해 각 행(데이터)의 rowid(주소)를 출력할 수 있다.

-- 테이블 내의 특정 행을, ROWID 값으로, 빠르게 조회가 가능하다.
-- 인덱스 내에 ROWID가 저장되어 있기 때문에 인덱스(index)를 사용할 때, 간접적으로 ROWID를 사용한다.

SELECT
    *
FROM
    dept
WHERE
    ROWID = 'AAASMaAAAAAACVGAAA';
-- rowid를 이용한 조건 검색
-- 이때 rowid는 실제로 있는 rowid를 활용해야 한다.

CREATE TABLE scott.employee(
    empno NUMBER(4),
    ename VARCHAR2(20),
    hiredate DATE,
    sal NUMBER(7, 2)
);      -- employee 테이블 생성
-- 이 경우에는 4자리 숫자의 empno, 20바이트 크기의 ename, 날짜 타입의 hiredate, 소숫점 7자리까지 표시하는 2크기의 숫자타입의 sal 컬럼을 가지는 employee테이블이 SCOTT계정에 생성된다.

DESC employee;
-- 생성한 테이블의 컬럼의 목록 확인하기
-- 제약조건을 작성하지 않으면 기본적으로 NULL제약조건이 자동으로 들어가게 된다.
 


-- ------------------------------------------------------
--  * Default 옵션
-- ------------------------------------------------------
-- 가. 테이블에 데이터 저장 시, 특정 컬럼에 값을 지정하지 않으면,
--     자동으로 NULL 값이 저장됨
-- 나. 컬럼에 값을 지정하지 않아도, 자동으로 기본값 입력
-- 다. NULL 값이 입력 방지
-- 라. 현재 날짜/성별 같은, 고정된 값만 가지는 컬럼에 대해 사용
-- ------------------------------------------------------

CREATE TABLE employee2 (
    empno NUMBER(4),
    ename VARCHAR2(20),
    hiredate DATE DEFAULT sysdate,
    sal NUMBER(7, 2)
);      -- employee2 테이블 생성 ( DEFAULT 옵션 사용 )

DESC employee2;
-- default 제약조건의 경우 desc로는 나타나지 않는다.

INSERT INTO employee2 (empno, ename, sal)
VALUES ( 10, '홍길동', 3000 );
-- hiredate 컬럼의 데이터는 제외한 컬럼들에게 데이터를 넣어 주었다.

SELECT
    *
FROM
    employee2;
-- 데이터가 정상적으로 삽입되었는지 확인해 본다.
-- 데이터를 넣지 않았던 hiredate 칼럼의 경우 default값인 sysdate가 값으로 들어가 있음을 알 수 있다.

commit;
-- commit을 해야지 다른 계정이나 다른 사람이 변경된 데이터를 볼 수 있다.

-- ------------------------------------------------------
-- * 제약조건(Contraints)
-- ------------------------------------------------------
--  가. 테이블에 부적절한 데이터가 저장되는 것을 방지 (*)
--  나. 테이블 생성시, 각 컬럼에 대해서 정의하는 규칙
--  다. DB 설계단계에서, 데이터의 무결성을 보장하기 위한 수단 (**)
--  라. 예: 성별('남','여'), 부서(NULL 값이 없어야 함)
--  마. 데이터가 저장되기 전에, 무결성을 검사하여,
--      잘못된 데이터가 저장되는 것을 방지
--  바. 테이블에 행이 삽입(INSERT)/수정(UPDATE)/삭제(DELETE)
--      될 때마다 적용
--  사. 필요 시, 제약조건의 기능을 일시적으로,
--      활성화(Enable)/비활성화(Disable) 가능 (***)
--  아. USER_CONSTRAINTS 데이터 딕셔너리에 저장
--  자. 제약조건의 종류:
--      (1) NOT NULL    - Only ( column-level )
--          a. 해당 컬럼값으로 NULL 허용하지 않는다
--      (2) UNIQUE      - Both ( column-level ) and ( table-level )
--          a. 해당 컬럼값은 항상 유일한 값을 갖는다
--          b. ( NOT NULL 허용 )
--      (3) PRIMARY KEY - Both ( column-level ) and ( table-level ) (***)
--          a. 해당 컬럼값은 반드시 존재해야 하고 유일해야 한다
--          b. ( NOT NULL + UNIQUE )
--          c. 해당 테이블에서 각 행들을 유일하게 구분해주는 식별기능
--          d. 테이블 당, 반드시 하나만 가질 수 있음
--          e. 단순/복합 컬럼으로 구성 가능
--          f. UNIQUE 성질로 인하여, 자동으로 UNIQUE INDEX 생성됨
--          g. 이 기본키를 이용한 데이터 검색은, 자동생성된 인덱스로 인하여
--             속도가 매우 빠르다
--      (4) FOREIGN KEY - Both ( column-level ) and ( table-level ) (***)
--          a. 해당 컬럼의 값이, 다른 테이블의 컬럼의 값을 참조해야 한다 (*)
--          b. 참조되는 컬럼에 없는 값은 저장이 불가능하다 (*)
--          c. ( NULL 허용 )
--      (5) CHECK       - Both ( column-level ) and ( table-level ) (***)
--          a. 해당 컬럼에 가능한, 데이터 값의 범위나 사용자 조건을 지정한다
--      차. 제약조건의 이름짓기 (**)
--      a. 명명방법: CONSTRAINT table_column_2자리제약조건종류 (*권장*)
--          - NOT NULL:     table_column_nn
--          - UNIQUE:       table_column_uk
--          - PRIMARY KEY:  table_column_pk
--          - FOREIGN KEY:  table_column_fk
--          - CHECK:        table_column_ck
--      b. 제약조건명으로, 기능을 활성화/비활성화 할 수 있음
--      c. 제약조건명을 직접 지정하지 않으면, 오라클이 자동으로 명명함
--      d. Oracle의 제약조건명 형식: Prefix(SYS_) + 자동이름
-- ------------------------------------------------------
-- * Column-level: 테이블 생성시,
--  가. 각 컬럼을 정의하면서, 같이 제약조건을 지정하는 방법
-- ------------------------------------------------------
-- Basic Syntax:
--
--  CREATE TABLE [스키마].테이블명(
--      컬럼명 데이터타입  [ CONSTRAINT 제약조건명 ]  PRIMARY KEY,
--      컬럼명 데이터타입,
--      ...
--  );
-- ------------------------------------------------------

DESC user_constraints;

SELECT
    *
FROM
    user_constraints
WHERE
    table_name = 'DEPARTMENT';
-- 해당 테이블의 제약조건을 출력한다. ( 디벨로퍼에서 실행 )

-- 컬럼 레벨(column-level) 방식의 기본 키(PRIMARY KEY) 설정
CREATE TABLE department(
    deptno NUMBER(2)    CONSTRAINT department_deptno_pk PRIMARY KEY,
    dname VARCHAR2(15),
    loc VARCHAR2(15)
);

COMMIT;

-- ------------------------------------------------------
-- * Table-level: 테이블 생성시,
--  가. 모든 컬럼을 정의하고, 맨 마지막에 제약조건을 추가하는 방법
--  나. 하나의 컬럼에 여러 개의 제약조건을 부여할 경우에 사용
-- ------------------------------------------------------
-- Basic Syntax:
--
--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입,
--      ...
--      컬럼명n 데이터타입,
--      [CONSTRAINT 제약조건명] PRIMARY KEY(컬럼명[,컬럼명2, ...])
--  );
-- ------------------------------------------------------

-- 테이블 레벨(table-level) 방식의 기본 키(PRIMARY KEY) 설정
CREATE TABLE department2 (
    deptno NUMBER(2),
    dname VARCHAR2(15),
    loc VARCHAR2(15),

    CONSTRAINT department2_deptno_pk PRIMARY KEY (deptno)
);


-- ------------------------------------------------------
-- USER_CONSTRAINTS 데이터 사전 (**)
-- ------------------------------------------------------
-- 특정 테이블의 제약조건 확인 (어떤 컬럼에 제약조건이 설정되어 있는지 확인불가)
-- 제약조건 타입(CONSTRAINT_TYPE 컬럼):
--  P: PRIMARY KEY, R: FOREIGN KEY, U: UNIQUE,
--  C: NOT NULL, CHECK (NOT NULL 제약조건은, NULL 값을 체크하는 조건으로 처리)
-- ------------------------------------------------------

DESC USER_CONSTRAINTS;

SELECT
    *
FROM
    USER_CONSTRAINTS
WHERE
    table_name IN ('DEPARTMENT','DEPARTMENT2');
-- 테이블명은 대문자로 작성해야지 출력이 된다. (***)

-- ------------------------------------------------------
-- USER_CONS_COLUMNS 데이터 사전 (**)
-- ------------------------------------------------------
-- 어떤 컬럼에 제약조건이 설정되어 있는지 확인가능

DESC USER_CONS_COLUMNS;

SELECT
    *
FROM
    USER_CONS_COLUMNS
WHERE
    table_name IN ('DEPARTMENT', 'DEPARTMENT2');
-- 어떤 칼럼에 어떤 제약조건이 설정되어 있는지 출력해 준다.
-- 테이블명은 대문자로 작성해야지 출력이 된다. (***)

-- ------------------------------------------------------
-- (1) PRIMARY KEY 제약조건
-- ------------------------------------------------------

-- 컬럼 레벨(column-level) 방식의 기본 키(PRIMARY KEY) 설정
CREATE TABLE department3(
    deptno NUMBER(2)
        CONSTRAINT
            department3_deptno_pk
            PRIMARY KEY,
    dname VARCHAR2(15),
    loc VARCHAR2(15)
);
-- 제약조건의 이름은 중복되면 안된다.

-- 테이블 레벨(table-level) 방식의 복합컬럼 기반의 기본키(PRIMARY KEY) 설정
CREATE TABLE department4(
    deptno NUMBER(2),
    dname VARCHAR2(15),
    loc VARCHAR2(15),

    -- table-level 제약조건 정의하는 경우에만, (***)
    -- 두 개 이상의 컬럼(복합컬럼)에 제약조건 정의가능
    CONSTRAINT department4_deptno_pk PRIMARY KEY(deptno, loc)
);

SELECT
    *
FROM
    USER_CONSTRAINTS
WHERE
    table_name IN ('DEPARTMENT3','DEPARTMENT4');
--

DESC USER_CONS_COLUMNS;

SELECT
    *
FROM
    USER_CONS_COLUMNS
WHERE
    table_name IN ('DEPARTMENT3', 'DEPARTMENT4');
-- 중복으로 지정하였어도 각각의 컬럼에 제약조건이 지정되어 있음을 알 수 있다.

-- ------------------------------------------------------

-- 중복저장 불가 (Primary Key)
INSERT INTO department (deptno, dname, loc)
VALUES (10, '인사', '서울');

-- ORA-00001: unique constraint (SCOTT.DEPARTMENT_DEPTNO_PK) violated
INSERT INTO department(deptno, dname, loc)
VALUES (10, '개발', '경기');

-- null 값 저장 불가
-- ORA-01400: cannot insert NULL into ("SCOTT"."DEPARTMENT"."DEPTNO")
INSERT INTO department(deptno, dname, loc)
VALUES (NULL, '개발', '경기');

-- ------------------------------------------------------
-- (2) UNIQUE 제약조건
-- ------------------------------------------------------
-- 가. 기본키가 아닌 경우에도, 컬럼의 모든 데이터가 유일해야 하는
--     경우에 지정
-- 나. 자동으로 UNIQUE INDEX 생성 -> 빠른 검색효과
-- 다. 기본키(Primary Key)와의 차이점:
--     a. 하나의 테이블에, 여러개의 UNIQUE 제약조건 지정가능
--     b. null 값도 저장가능***
-- 라. 제약조건명 형식: table_column_uk
-- 마. 단순/복합 컬럼에 대해 지정가능
-- ------------------------------------------------------

-- ------------------------------------------------------
-- Basic Syntax1: column-level
--
--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입 [CONSTRAINT 제약조건명] UNIQUE,
--      컬럼명2 데이터타입,
--      ...
--  );
-- ------------------------------------------------------

-- column-level
CREATE TABLE department5(
    deptno NUMBER(2)
        CONSTRAINT department5_deptno_pk PRIMARY KEY,
    dname VARCHAR2(15)
        CONSTRAINT department5_dname_uk UNIQUE,
    loc VARCHAR2(15)
);
-- 제약조건을 확인할 때에는 디벨로퍼를 사용하는 것이 좋다.

-- 중복저장 불가 (Primary Key)
INSERT INTO department5 (deptno, dname, loc)
VALUES (10, '인사', '서울');

-- ORA-00001: unique constraint (SCOTT.DEPARTMENT5_DNAME_UK) violated
INSERT INTO department5 (deptno, dname, loc)
VALUES (20, '인사', '경기');

-- null 값 저장 허용 ( PK와의 차이점 ) (**)
INSERT INTO department5 (deptno, dname, loc)
VALUES (30, NULL, '서울');

-- ------------------------------------------------------
-- Basic Syntax2: table-level
--
--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입,
--      컬럼명2 데이터타입,
--      ...
--      [CONSTRAINT 제약조건명] UNIQUE(컬럼명1 [,컬럼명2])
--  );
-- ------------------------------------------------------

-- table-level
CREATE TABLE department6(
    deptno NUMBER(2)
        CONSTRAINT department6_deptno_pk PRIMARY KEY,
    dname VARCHAR2(15),
    loc VARCHAR2(15),

    CONSTRAINT department6_dname_uk UNIQUE(dname, loc)
);

-- 중복저장 불가 (Primary Key)
INSERT INTO department6 (deptno, dname, loc)
VALUES (10, '인사', '서울');

INSERT INTO department6 (deptno, dname, loc)
VALUES (20, '인사', '경기');

-- 중복된 값으로 인해 오류발생
INSERT INTO department6 (deptno, dname, loc)
VALUES (30, '인사', '서울');

-- null 값 저장 허용
INSERT INTO department6 (deptno, dname, loc)
VALUES (40, null, '수원');

INSERT INTO department6 (deptno, dname, loc)
VALUES (50, '개발', null);

-- NULL이 2개이어도 가능하다.
INSERT INTO department6 (deptno, dname, loc)
VALUES (60, null, null);

SELECT
    *
FROM
    department6;

-- ------------------------------------------------------
-- (3) NOT NULL 제약조건
-- ------------------------------------------------------
-- 가. 해당 컬럼에 NULL 값 저장 방지
-- 나. 컬럼-레벨 방식만 허용 (** 테이블-레벨 방식 비허용 **) (**)
-- 다. null 값을 허용하는 기존 컬럼의 동작을 수정 -->
--     제약조건 추가가 아니라, 기존 조건의 수정 (**)
-- 라. 제약조건명 형식: table_column_nn
-- ------------------------------------------------------
-- Basic Syntax: column-level

--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입 [CONSTRAINT 제약조건명] NOT NULL,
--      컬럼명2 데이터타입,
--      ...
--  );
-- ------------------------------------------------------
CREATE TABLE department7(
    deptno NUMBER(2)
        CONSTRAINT DEPARTMENT7_deptno_pk PRIMARY KEY,
    dname VARCHAR2(15)
        CONSTRAINT department7_dname_uk UNIQUE,
    loc VARCHAR2(15)
        CONSTRAINT department7_loc_nn NOT NULL
);
-- NOT NULL은 칼럼 레벨만 가능해서 테이블 레벨로는 지정이 불가능하다.

-- 널(null) 값 저장 불가
-- ORA-01400: cannot insert NULL into ("SCOTT"."DEPARTMENT7"."LOC")
INSERT INTO department7 (deptno, dname, loc)
VALUES (30, '인사', NULL);

-- ------------------------------------------------------
-- (4) CHECK 제약조건
-- ------------------------------------------------------
-- 가. 해당 컬럼에 저장되는 데이터를 검사하여,
--     조건과 일치하는 데이터만 저장가능
-- 나. 제약조건명 형식: table_column_ck
-- ------------------------------------------------------

-- ------------------------------------------------------
-- Basic Syntax1: column-level

--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입 [CONSTRAINT 제약조건명] CHECK(조건식),
--      컬럼명2 데이터타입,
--      ...
--  );
-- ------------------------------------------------------

CREATE TABLE department8(
    deptno NUMBER(2),
    dname VARCHAR2(15)
        CONSTRAINT department8_dname_ck
            CHECK ( dname IN ('개발','인사')),
    loc VARCHAR2(15)
);
-- 체크 조건에 있지 않은 데이터로 못들어가게 막아버린다. (*)
-- where절과 같은 기능을 한다. (*)

-- CHECK 제약조건에 부합
INSERT INTO department8 (deptno, dname, loc)
VALUES (10, '개발', '서울');

INSERT INTO department8 (deptno, dname, loc)
VALUES (20, '인사', '경기');

-- CHECK 제약조건에 위배
-- ORA-02290: check constraint (SCOTT.DEPARTMENT8_DNAME_CK) violated
INSERT INTO department8 (deptno, dname, loc)
VALUES (30, '개발부', '서울');

-- ------------------------------------------------------
-- Basic Syntax2: table-level
--
--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입 ,
--      컬럼명2 데이터타입,
--      ... ,
--
--      [CONSTRAINT 제약조건명] CHECK(조건식)
--  );
-- ------------------------------------------------------

CREATE TABLE department9(
    deptno NUMBER(2),
    dname VARCHAR2(15),
    loc VARCHAR2(15),

    CONSTRAINT department9_dname_ck
        CHECK( dname IN ('개발', '인사')),

    CONSTRAINT department9_loc_ck
        CHECK( loc IN ('서울', '경기'))
);
-- CHECK 제약조건의 경우 중복컬럼으로 지정하는 것이 불가능하기에, 테이블 레벨이라도 각각 컬럼에 대해 따로 지정해야 한다. (**)
-- NULL값도 제약조건에 맞지 않기에 들어오지 못한다.

-- CHECK 제약조건에 부합
INSERT INTO department9 (deptno, dname, loc)
VALUES (10, '개발', '서울');

INSERT INTO department9 (deptno, dname, loc)
VALUES (20, '인사', '경기');

-- CHECK 제약조건에 위배
-- ORA-02290: check constraint (SCOTT.DEPARTMENT9_DNAME_CK) violated
INSERT INTO department9 (deptno, dname, loc)
VALUES (30, '개발부', '서울');

 

-- ------------------------------------------------------
-- (5) FOREIGN KEY(외래키, 참조키) 제약조건 (= 참조무결성 제약조건) (*****)
-- ------------------------------------------------------
-- 가. '외래키' 또는 '참조키' 라고 부름
-- 나. 자식 테이블에서 부모 테이블을 참조할 때, 올바른 데이터만
--     참조 가능하도록 제약하는 방법 (**)
-- 다. null 값 허용
-- 라. 제약조건명 형식: table_column_fk
-- ------------------------------------------------------

-- deptno: 외래키(foreign key) or 참조키(reference key)
SELECT
    empno,
    deptno
FROM
    emp;
-- emp 테이블에서 empno와 deptno를 추출

-- deptno: 기본키(primary key)
SELECT
    *
FROM
    dept;
-- dept테이블의 기본키 확인(deptno)
-- emp에서는 FK가 된다.

-- 참조 무결성 제약조건 위배
-- ORA-02291: integrity constraint (SCOTT.FK_DEPTNO) violated - parent key not found
INSERT INTO emp (empno, ename, deptno)
VALUES (9000, 'John', 50);

-- ------------------------------------------------------
-- Basic Syntax1: column-level

--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입 [CONSTRAINT 제약조건명] REFERENCES 부모테이블명(컬럼명),
--      컬럼명2 데이터타입,
--      ...
--  );

-- ** 주의1 ** :
-- 참조하는 부모테이블의 컬럼은, 반드시 1) 기본키(Primary Key)
-- 또는 2) UNIQUE 제약조건이 설정된 컬럼 이어야 함!!!

-- UNIQUE도 NULL을 허용한다는 것을 제외하면 기본키와 거의 동일한 기능을 하기에 가능하다.
-- 하지만 UNIQUE는 잘 사용하지 않는다.

-- PK/UK 아닌 컬럼을, 왜래키 제약조건으로 설정 시도 -> 오류발생(불가능) (**)
-- 이름이 같다고 할 수 있는 것이 아니다.(**)

-- ** 주의2 ** :
-- 외래키는, 부모 테이블과 자식 테이블 간의 참조 무결성을 위한
-- 제약조건이기 때문에, 자식 테이블에서 참조하게 되는 컬럼을
-- 부모 테이블에서 기본키 또는 UNIQUE로 지정해 두어야 함!!!
-- ------------------------------------------------------
CREATE TABLE dept00(
    deptno NUMBER(2) CONSTRAINT dept02_empno_pk PRIMARY KEY,
    dname VARCHAR2(15),
    loc VARCHAR2(15)
);

INSERT INTO dept00(deptno, dname, loc)
VALUES(10, '인사', '서울');

INSERT INTO dept00(deptno, dname, loc)
VALUES(20, '개발', '광주');

INSERT INTO dept00(deptno, dname, loc)
VALUES(30, '관리', '부산');

INSERT INTO dept00(deptno, dname, loc)
VALUES(40, '영업', '경기');

COMMIT;

SELECT
    *
FROM
    dept00;
-- 데이터가 잘 들어가 있는지 확인
-- ------------------------------------------------------

CREATE TABLE emp00(
    empno NUMBER(4) CONSTRAINT emp00_empno_pk PRIMARY KEY,                  -- PK
    ename VARCHAR2(15),
    deptno NUMBER(2) CONSTRAINT emp00_deptno_fk REFERENCES dept00(deptno)    -- FK
);
-- 기본키나 UNIQUE만 들어갈 수 있기에 테이블 생성할 때 PK와 FK를 잘 살펴봐야 한다.

INSERT INTO emp00 (empno, ename, deptno)
VALUES (1000, 'John', 10);

INSERT INTO emp00 (empno, ename, deptno)
VALUES (2000, 'Smith', 20);

INSERT INTO emp00 (empno, ename, deptno)
VALUES (3000, 'Sam', NULL);
-- FK는 NULL 값을 허용한다. (NULL이 참조당하는 테이블에 없어도 가능(애초에 기본키는 NULL값이 불가능))

-- ORA-02291: integrity constraint (SCOTT.EMP02_DEPTNO_FK) violated - parent key not found
INSERT INTO emp00 (empno, ename, deptno)
VALUES (4000, 'Mike', 50);
-- FK로 사용할 때에는 값이 참조당하는 테이블에 값이 있어야 한다.

COMMIT;

-- USER_CONSTRAINTS 데이터 사전
DESC user_constraints;

SELECT
    table_name,
    constraint_type,
    constraint_name,
    r_constraint_name
FROM
    user_constraints
WHERE
    table_name IN ('DEPT00', 'EMP00');
-- 제약 조건을 확인해 본다.
-- r_constraint_name는 참조키를 의미한다.

-- ------------------------------------------------------
-- Basic Syntax2: table-level

--  CREATE TABLE [스키마].테이블명 (
--      컬럼명1 데이터타입,
--      컬럼명2 데이터타입,
--      ...,
--      [CONSTRAINT 제약조건명] FOREIGN KEY(컬럼명n) REFERENCES 부모테이블명(컬럼명)
--  );

-- ** 주의1 ** :
-- 참조하는 부모테이블의 컬럼은, 반드시 1) 기본키(Primary Key)
-- 또는 2) UNIQUE 제약조건이 설정된 컬럼 이어야 함!!!

-- PK/UK 아닌 컬럼을, 왜래키 제약조건으로 설정 시도 -> 오류발생

-- ** 주의2 ** :
-- 외래키는, 부모 테이블과 자식 테이블 간의 참조 무결성을 위한
-- 제약조건이기 때문에, 자식 테이블에서 참조하게 되는 컬럼을
-- 부모 테이블에서 기본키 또는 UNIQUE로 지정해 두어야 함!!!
-- ------------------------------------------------------

CREATE TABLE emp03 (
    empno   NUMBER(4)       CONSTRAINT emp03_empno_pk PRIMARY KEY,
    ename   VARCHAR2(15),
    deptno  NUMBER(2),

    CONSTRAINT emp03_deptno_fk FOREIGN KEY(deptno) REFERENCES dept00(deptno)
);

INSERT INTO emp03 (empno, ename, deptno)
VALUES (1000, 'John', 10);

INSERT INTO emp03 (empno, ename, deptno)
VALUES (2000, 'Smith', 20);

INSERT INTO emp03 (empno, ename, deptno)
VALUES (3000, 'Sam', NULL);
-- FK에 NULL값은 들어갈 수 있다.

-- FOREIGN KEY 제약조건 위배
-- ORA-02291: integrity constraint (SCOTT.EMP03_DEPTNO_FK) violated - parent key not found
INSERT INTO emp03 (empno, ename, deptno)
VALUES (4000, 'Mike', 50);
-- 참조당하는 테이블에 없는 값은 들어갈 수 없다.

COMMIT;


-- ------------------------------------------------------
-- 참조 무결성 제약조건 위배
-- ------------------------------------------------------
-- 특정부서(부모)를 참조하고 있는 사원(자식)들이 있으므로,
-- 부서를 삭제할 수 없음 (참조관계 존재)
-- ORA-02292: integrity constraint (SCOTT.EMP02_DEPTNO_FK) violated -
--            child record found
DELETE FROM dept00
WHERE deptno = 10;      -- 부모 테이블의 특정부서 삭제

-- 해결방법(2가지)
-- ------------------------------------------------------
-- 1) ON DELETE CASCADE
-- ------------------------------------------------------
-- 참조하는 부모테이블의 행이 삭제되면, 해당 행을 참조하는
-- 자식테이블의 행도 연쇄삭제 됨.
-- ------------------------------------------------------
DROP TABLE emp02;
DROP TABLE emp03;

CREATE TABLE emp02(
    empno NUMBER(4) CONSTRAINT emp02_empno_pk PRIMARY KEY,
    ename VARCHAR2(15),
    deptno NUMBER(2) CONSTRAINT emp02_deptno_fk
        REFERENCES dept00(deptno) ON DELETE CASCADE
);
-- ON DELETE CASCADE는 참조하고 있는 테이블의 기본키가 삭제되면 연쇄적으로 삭제하겠다는 의미이다.

-- ------------------------------------------------------
-- 2) ON DELETE SET NULL
-- ------------------------------------------------------
-- 참조하는 부모 테이블의 행이 삭제되면, 해당 행을 참조하는 자식
-- 테이블의 컬럼값을 NULL로 설정한다.
-- ------------------------------------------------------
DROP TABLE emp02;
DROP TABLE emp03;

CREATE TABLE emp02(
    empno NUMBER(4) CONSTRAINT emp02_empno_pk PRIMARY KEY,
    ename VARCHAR2(15),
    deptno NUMBER(2) CONSTRAINT emp02_deptno_fk
        REFERENCES dept00(deptno) ON DELETE SET NULL
);
-- 부모 테이블의 행이 삭제되면 참조하고 있던 자식테이블에서는 해당 칼럼(fk)값을 NULL로 지정해 준다.

-- ------------------------------------------------------
-- 2. 테이블 삭제
-- ------------------------------------------------------
-- 가. 삭제되는 테이블에 저장된 모든 데이터/관련 인덱스/외래키
--     제약조건을 제외한, 모든 제약조건이 같이 삭제된다.
-- 나. 외래키 제약조건은 자동으로 삭제되지 않기 때문에, 자식 테이블
--     에서 부모테이블을 참조하는 상황에서, 부모 테이블을 삭제하면,
--     종속성에 의해서, 삭제가 안됨.

--     이 경우에 CASCADE CONSTRAINTS 옵션을 지정하여 삭제하면,
--     연쇄적으로 제약조건도 함께 삭제되기 때문에, 부모 테이블 삭제가능
-- ------------------------------------------------------
-- Basic Syntax:

--  DROP TABLE 테이블명 [CASCADE CONSTRAINTS];
-- ------------------------------------------------------
-- 참조키에 의한 테이블 삭제불가.
-- 자식 테이블이 참조하는 상황에서, 부모 테이블 삭제시도

-- ORA-02449: unique/primary keys in table referenced by foreign keys
DROP TABLE dept00;  -- 부모테이블 삭제불가
-- 지금 FK로 참조당하고 있어 삭제가 불가능하다고 되어 있다.
-- ------------------------------------------------------
-- 자식 테이블에 설정된, 외래키 제약조건까지 연쇄적으로 삭제하기 위해,
-- CASCADE CONSTRAINTS 옵션 추가.
DROP TABLE dept00 CASCADE CONSTRAINTS;
-- 이 경우에는 참조관계를 끊어버리는데, 자식테이블에 있던 값은 그대로 존재한다.
-- 그러나 이렇게 되면 데이터의 의미가 사라져버리기에 CASCADE CONSTRAINTS는 신중하게 사용해야 한다.(***)

-- ------------------------------------------------------
-- 3. Flashback Drop ( 휴지통 기능 )
-- ------------------------------------------------------
-- 가. 삭제된 테이블을 복구하는 방법 (from Oracle10g)
-- 나. 테이블 삭제할 때, (DROP TABLE tablename;)
--     삭제된 테이블은 휴지통(RECYCLEBIN)이라는 특별한 객체에,
--     'BIN$' prefix가 붙은, 이름으로 저장됨.
-- 다. 삭제된 테이블을 다시 복구하고 싶을 때, Flashback Drop
--     복구기술을 이용하여, 휴지통(RECYCKEBIN) 객체에서, 삭제된
--     테이블을 복구할 수 있다.
-- ------------------------------------------------------

-- ------------------------------------------------------
-- * Flashback Drop Commands *
-- ------------------------------------------------------
SHOW RECYCLEBIN;               -- RECYCLEBIN 객체정보 조회

FLASHBACK TABLE tablename TO BEFORE DROP;   -- 삭제된 테이블 복구

DROP TABLE tablename PURGE;                 -- 테이블 완전삭제(복구불가)

PURGE RECYCLEBIN;                           -- RECYCLEBIN 객체정보 삭제
-- ------------------------------------------------------
SHOW RECYCLEBIN;
-- RECYCLEBIN 객체정보 조회 ( 언제 삭제하였는지도 알려준다. )
-- 디벨로퍼에서만 가능하다. (vscode에서는 정상적으로 보여주지 못한다.)

SELECT * FROM tab;
-- 현재 계정 밑에 있는 모든 DB객체를 보여준다. ( 휴지통에 있는 것도 보여준다. ) (***)
-- vscode에서도 정상적으로 작동된다.

DROP TABLE dept00;

-- 삭제된 테이블 복구
FLASHBACK TABLE dept00 TO BEFORE DROP;

SELECT * FROM dept00;

COMMIT;

SELECT * FROM USER_CONSTRAINTS WHERE table_name = 'DEPT00';
-- 제약조건은 테이블을 되살린다고 하여도 살려낼 수는 없다. (***)

DROP TABLE dept02 PURGE;
-- PURGE를 작성했을 경우 복구가 불가능하기에 조심해야 한다.

PURGE RECYCLEBIN;
-- 휴지통을 비워준다. (***)

-- ------------------------------------------------------
-- 4. 테이블 변경
-- ------------------------------------------------------
-- 가. 생성된 테이블의 구조(스키마)를 변경
--     a. 컬럼의 추가/삭제
--     b. 컬럼의 타입/길이 변경
--     c. 컬럼의 제약조건 추가/삭제
-- 나. ALTER TABLE 문장 사용
-- 다. 테이블의 구조변경은 기존 저장된 데이터에 영향을 주게 됨
-- ------------------------------------------------------
DROP TABLE emp04;

CREATE TABLE emp04 AS
SELECT
    *
FROM
    emp;
-- NULL 외의 제약조건은 복사되지 않는다. (*)
-- 타입, 컬럼, 데이터는 복사된다.

DESC emp04;

-- ------------------------------------------------------
-- (1) 컬럼 추가 (ALTER TABLE ADD 문장)
-- ------------------------------------------------------
-- a. 기존 테이블에 새로운 컬럼 추가
-- b. 추가된 컬럼은, 테이블의 마지막에 추가 (**)
-- c. 데이터는 자동으로 null 값으로 저장됨
-- d. DEFAULT 옵션 설정도 가능
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  ADD ( 컬럼명1 데이터타입 [, ..., 컬럼명n 데이터타입] );
-- ------------------------------------------------------

ALTER TABLE emp04
ADD (
        email VARCHAR2(10),
        address VARCHAR2(20)
);
-- emp04테이블에 email과 address 칼럼을 추가해보았다.

DESC emp04;
-- 추가한 email과 address 칼럼이 마지막에 추가되어 있음을 알 수 있다.
-- 추가한 칼럼의 값은 NULL로 들어가게 된다.

-- ------------------------------------------------------
-- (2) 컬럼 변경 (ALTER TABLE MODIFY 문장)
-- ------------------------------------------------------
-- a. 기존 테이블에 기존 컬럼 변경 (** 오류가 발생할 수 있다.)
-- b. 컬럼의 타입/크기/DEFAULT값 변경가능
--    숫자/문자 컬럼의 전체길이의 증가/축소, 타입변경도 가능
-- c. DEFAULT 값 변경의 경우, 이후 입력되는 행에 대해서만 적용
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  MODIFY ( 컬럼명1 데이터타입 [, ..., 컬럼명n 데이터타입] );
-- ------------------------------------------------------
DESC emp04;

ALTER TABLE emp04
MODIFY ( email VARCHAR2(40) );
-- 칼럼 타입의 크기가 정상적으로 변경되었다.

ALTER TABLE emp04
MODIFY ( ename VARCHAR2(20) );
-- 칼럼 타입의 크기가 잘 변경되었는지 확인하고, 데이터가 유실되지 않았는지 확인해야 한다.(***)

ALTER TABLE emp04
MODIFY ( ename VARCHAR2(5) );
-- 크기를 늘리는 것은 잘 되나, 크기를 축소시킬 경우 오류가 발생하거나 데이터가 유실될 수 있다. (***)

ALTER TABLE emp04
MODIFY ( sal VARCHAR2(5) );
-- 데이터 타입을 변경하기 위해서는 해당 컬럼에는 데이터가 없어야 가능하다. (***)

-- ------------------------------------------------------
-- (3) 컬럼 삭제 (ALTER TABLE DROP 문장)
-- ------------------------------------------------------
-- a. 기존 테이블에 기존 컬럼 삭제
-- b. 컬럼은 값의 존재여부와 상관없이, 무조건 삭제됨
-- c. 동시에 여러 컬럼삭제가 가능
-- d. 최소한 1개의 컬럼은 반드시 존재해야 됨

-- + 컬럼은 휴지통으로 들어갈 수 없다. (복구 불가능)
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  DROP ( 컬럼명1, [컬럼명n] );
-- ------------------------------------------------------
DESC emp04;

ALTER TABLE emp04
DROP (email);
-- emp04 테이블의 email 칼럼을 삭제하였다.

-- ------------------------------------------------------
-- 5. 제약조건 추가 (ALTER TABLE 문장)
-- ------------------------------------------------------
-- 가. 기존 테이블에 제약조건 추가
-- 나. PK/FK/UK/CK 제약조건 추가 -> ALTER TABLE ADD 문 사용
-- 다. NN 제약조건 추가 -> ALTER TABLE MODIFY 문 사용 ( NOT NULL은 제약조건을 생성하는 것이 아니라 기존 제약조건을 변경하는 것이다. )
-- 라. 기존 테이블에 추가적인 제약조건도 추가 가능
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  ADD [CONSTRAINT 제약조건명] 제약조건타입(컬럼명);
-- ------------------------------------------------------

-- ------------------------------------------------------
-- (1) PRIMARY KEY 제약조건 추가
-- ------------------------------------------------------

-- 제약조건이 없는 테이블 생성
CREATE TABLE dept03(
    deptno  NUMBER(2),
    dname   VARCHAR2(15),
    loc     VARCHAR2(15)
);

DESC dept03;

ALTER TABLE dept03
ADD CONSTRAINT dept03_deptno_pk PRIMARY KEY(deptno);

-- 기본키 제약조건 추가 확인
SELECT
    *
FROM
    USER_CONSTRAINTS
WHERE
    table_name in ('DEPT03');
-- 제약조건이 추가되어 있는 것을 알 수 있다.

-- ------------------------------------------------------
-- (2) NOT NULL 제약조건 추가 (CK/PK/FK 제약조건 추가도 동일)
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  MODIFY ( 컬럼명 데이터타입 [CONSTRAINT 제약조건명] NOT NULL );
-- ------------------------------------------------------
DESC dept03;

-- NOT NULL 제약조건 추가
ALTER TABLE dept03
MODIFY ( dname VARCHAR2(15) CONSTRAINT dept03_dname_nn NOT NULL );

SELECT
    *
FROM
    USER_CONSTRAINTS
WHERE
    table_name in ('DEPT03');
-- 제약조건이 잘 되었는지 확인

-- ------------------------------------------------------
-- 6. 제약조건 삭제 (ALTER TABLE DROP 문)
-- ------------------------------------------------------
--  가. 제약조건명 이용
--      USER_CONSTRAINTS, USER_CON_COLUMNS 조회하여,
--      제약조건명 조회
--  나. CASCADE 옵션
--      모든 종속적인 제약조건을 같이 삭제
--  다. 기본적으로, 제약조건명을 이용하여, 제약조건 삭제 (**)
--  라. 기본키(PK)와 UNIQUE(UK)는 제약조건명 없이,
--      키워드만 사용하여 삭제가능 (**)
--      NN/CK/FK 제약조건 삭제 -> CONSTRAINT 제약조건명 지정하여 삭제 (**)
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  DROP PRIMARY KEY | UNIQUE(컬럼) | CONSTRAINT 제약조건명 [CASCADE];
-- ------------------------------------------------------

-- PK 제약조건 확인
SELECT
    *
FROM
    USER_CONSTRAINTS
WHERE
    table_name IN ('DEPT03');
-- DEPT03테이블에 있는 모든 제약조건 확인

-- ------------------------------------------------------
-- (1) PK 제약조건 삭제 (2가지 방법)
-- ------------------------------------------------------
-- 1st. method
ALTER TABLE dept03
DROP PRIMARY KEY;

-- 2nd. method
ALTER TABLE dept03
DROP CONSTRAINT dept03_deptno_pk;
-- 제약조건명을 통해서 PK를 삭제하였다.

-- ------------------------------------------------------
-- (2) NN 제약조건 삭제 ( NOT NULL )
-- ------------------------------------------------------
ALTER TABLE dept03
DROP CONSTRAINT dept03_dname_nn;
-- 이와 같이 제약조건명을 통해서 삭제가 가능하기에 제약조건명을 관례에 따라서 작성하는 것이 좋다.

-- ------------------------------------------------------
-- (3) CASCADE 옵션 적용
-- ------------------------------------------------------
CREATE TABLE dept05(
    deptno NUMBER(2) CONSTRAINT dept05_deptno_pk PRIMARY KEY,
    dname VARCHAR2(15),
    loc VARCHAR2(15)
);

INSERT INTO dept05 (deptno, dname, loc)
VALUES (10, '인사', '서울');

COMMIT;
-- ------------------------------------------------------
CREATE TABLE emp05(
    empno NUMBER(4) CONSTRAINT emp05_empno_pk PRIMARY KEY,
    ename VARCHAR2(15),
    deptno NUMBER(2) CONSTRAINT emp05_deptno_fk REFERENCES dept05(deptno)
);

INSERT INTO emp05 (empno, ename, deptno)
VALUES (1000, 'John', 10);

COMMIT;
-- ------------------------------------------------------

ALTER TABLE dept05
DROP PRIMARY KEY;
-- 참조키에 의한 기본 키 삭제는 불가능하다.
-- 자식테이블에서 부모테이블을 참조하고 있는 경우, 부모테이블의 기본키(PK)를 삭제하면 에러가 발생한다.

-- 부모테이블의 PK/UK 제약조건 삭제시, 자식테이블의 FK 제약조건을 연쇄삭제위해
-- CASCADE 옵션 사용
ALTER TABLE dept05
DROP PRIMARY KEY CASCADE;

-- ------------------------------------------------------
-- 7. 제약조건 활성화/비활성화
-- ------------------------------------------------------
--  가. 기존 테이블의 제약조건을 필요에 의해 Enable/Disable 가능
--  나. 제약조건은 데이터의 무결성은 보장받을 수 있으나,
--      성능은 떨어뜨림 (**)
--  다. 예: 데이터의 무결성이 보장되는 방대한 데이터를, 테이블에
--          저장시 사용
-- ------------------------------------------------------
-- Basic Syntax:

--  ALTER TABLE 테이블명
--  DISABLE | ENABLE CONSTRAINT 제약조건명 [CASCADE];

--  * ENABLE: 제약조건 활성화
--  * DISABLE: 제약조건 비활성화
--  * CASCADE: 해당 제약조건과 관련된 모든 제약조건을 연쇄적으로 비활성화 (강행해버린다.)
-- ------------------------------------------------------

-- ------------------------------------------------------
-- 1) PK 제약조건 비활성화
-- ------------------------------------------------------
ALTER TABLE emp05
DISABLE CONSTRAINT emp05_empno_pk;
-- emo05테이블의 기본키를 비활성화 시켰다.

-- ALTER TABLE dept
-- DISABLE CONSTRAINT pk_dept;
-- pk_dept처럼 제약조건을 더 간단하게 표시하는 경우도 있기에, 제약조건을 꼭 확인해봐야 한다.

SELECT
    table_name,
    constraint_type,
    constraint_name,
    status
FROM
    USER_CONSTRAINTS
WHERE
    table_name IN ('EMP05');
-- 이를 통해서 제약조건의 상태를 확인한다.

-- ------------------------------------------------------
-- 2) PK 제약조건 활성화
-- ------------------------------------------------------
ALTER TABLE emp05
ENABLE CONSTRAINT emp05_empno_pk;

SELECT
    table_name,
    constraint_type,
    constraint_name,
    status
FROM
    USER_CONSTRAINTS
WHERE
    table_name IN ('EMP05');
-- status 칼럼을 통해 현제 테이블의 제약조건의 상태를 확인할 수 있다.
-- 데이터 사전에서 필요한 것은 DESC를 통해서 확인한 후 활용하면 된다.

-- ------------------------------------------------------
-- 8. 데이터 사전(Data Dictionary View) 3종류
-- ------------------------------------------------------
-- (1) DBA_XXXX : 데이터베이스 관리자만 접근가능한 객체 등의 정보조회 (sys계정에서만 가능)
-- (2) ALL_XXXX : 자신계정 소유 또는 권한을 부여받은 객체 등에 관한 모든 정보조회
-- (3) USER_XXXX: 자신의 계정이 소유한 객체 등에 관한 정보조회 (현재 계정에서만 가능)
-- ------------------------------------------------------

-- ------------------------------------------------------
-- * 데이터 사전(Data Dictionary View)에 저장되는 정보 *
-- ------------------------------------------------------
--  가. DB의 물리적 구조 또는 객체의 논리적 구조
--  나. Oracle 사용자와 스키마 객체명
--  다. 각 사용자에게 부여된 권한과 롤(role)
--  라. 무결성 제약조건
--  마. 컬럼 기본값
--  바. 스키마 객체에 할당된 영역의 크기와
--      현재 사용중인 영역의 크기
--  사. DB 이름/버전/생성날짜/시작모드/인스턴스명 같은 일반정보
-- ------------------------------------------------------
 
 
 
 
728x90
댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항