티스토리 뷰
-- ------------------------------------------------------
-- 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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 53일차 - INDEX (***) / 사용자 관리 (0) | 2022.05.12 |
---|---|
KH 52일차 - View (0) | 2022.05.11 |
KH 50일차 - INSERT / UPDATE / DELETE / MERGE (***) (0) | 2022.05.09 |
KH 49일차 - INSERT 문 (***) (0) | 2022.05.06 |
KH 48일차 - 서브 쿼리 (****) (0) | 2022.05.04 |
댓글