251031 TIL

2025. 10. 31. 18:01Courses/아이티윌 오라클 DBA 과정

FLASHBACK TABLE(10g)

  • 삭제한 테이블을 복원하는 SQL문

삭제한 테이블 조회

SHOW recyclebin

SELECT * FROM user_recyclebin;

SELECT * FROM dba_recyclebin WHERE owner = 'HR';

삭제한 테이블 영구 삭제

PURGE recyclebin

테이블 삭제

DROP TABLE hr.emp;

SELECT * FROM user_recyclebin;

삭제 테이블 조회

SELECT * FROM "BIN$OCbOYC3eQU6vZWJizOBiBA==$0";
  • user_recyclebin 에서 조회한 OBJECT_NAME을 테이블명으로 조회

테이블 복원

FLASHBACK TABLE emp TO BEFORE DROP;

  • 테이블은 원래대로 복원되지만, 인덱스와 제약 조건은 이름이 바뀜 → RENAME 작업 해줘야 함
DROP TABLE hr.emp;

CREATE TABLE hr.emp
AS SELECT * FROM hr.employees;

SELECT * FROM user_recyclebin;

DROP TABLE hr.emp;

SELECT * FROM user_recyclebin;

FLASHBACK TABLE emp TO BEFORE DROP;

SELECT * FROM user_recyclebin;

  • recyclebin에 동일한 테이블이 있는 경우 가장 최근에 삭제한 테이블을 복원
    • Stack 구조 (LIFO)
FLASHBACK TABLE emp TO BEFORE DROP;

  • 복원해야 할 테이블 이름과 동일한 이름이 있을 경우 오류 발생

새로운 이름으로 복원

FLASHBACK TABLE emp TO BEFORE DROP RENAME TO emp_new;

테이블 영구히 삭제

DROP TABLE hr.emp_new PURGE;

특정한 테이블만 recyclebin에서 영구히 삭제

PURGE TABLE EMP;

TRUNCATE

  • 테이블 행을 전부 삭제할 때 사용하는 SQL문
  • DELETE문과 비슷하지만 TRUNCATE는 UNDO, REDO 발생량을 최소화하며 행을 지움
  • DELETE문은 ROLLBACK이 가능하지만, TRUNCATE는 ROLLBACK 불가
  • TRUNCATE는 MINEXTENT(1개)만 남기고, EXTENT를 지움

스토리지 관련 뷰

세그먼트

SELECT * FROM user_segments WHERE segment_name = 'EMP';
SELECT * FROM dba_segments WHERE segment_name = 'EMP' AND owner = 'HR';

익스텐트

SELECT * FROM user_extents WHERE segment_name = 'EMP';
SELECT * FROM dba_extents WHERE segment_name = 'EMP' AND owner = 'HR';

DELETE vs TRUNCATE

삭제 전

SELECT * FROM user_segments WHERE segment_name = 'EMP';
SELECT * FROM user_extents WHERE segment_name = 'EMP';

DELETE로 삭제

DELETE FROM hr.emp;
COMMIT;

SELECT * FROM user_segments WHERE segment_name = 'EMP';
SELECT * FROM user_extents WHERE segment_name = 'EMP';

  • DELETE는 삭제해도 늘어난 스토리지 공간이 줄어들지 않음

TRUNCATE로 삭제

TRUNCATE TABLE hr.emp;

SELECT * FROM user_segments WHERE segment_name = 'EMP';
SELECT * FROM user_extents WHERE segment_name = 'EMP';

  • TRUNCATE는 MINEXTENT만 남기고 EXTENT를 모두 지움

COMMENT

  • 테이블과 컬럼의 주석(설명)을 만드는 SQL 문

테이블 주석 조회

SELECT * FROM user_tab_comments WHERE table_name = 'EMPLOYEES';
SELECT * FROM dba_tab_comments WHERE table_name = 'EMPLOYEES' AND owner = 'HR';

컬럼 주석 조회

SELECT * FROM user_col_comments WHERE table_name = 'EMPLOYEES';
SELECT * FROM dba_col_comments WHERE table_name = 'EMPLOYEES' AND owner = 'HR';

테이블 주석 생성

COMMENT ON TABLE hr.emp IS '사원 정보 테이블';
SELECT * FROM user_tab_comments WHERE table_name = 'EMP';

컬럼 주석 생성

COMMENT ON COLUMN hr.emp.employee_id IS '사원 번호';
COMMENT ON COLUMN hr.emp.salary IS '사원 급여';
SELECT * FROM user_col_comments WHERE table_name = 'EMP';

테이블 주석 삭제

COMMENT ON TABLE hr.emp IS '';
SELECT * FROM user_tab_comments WHERE table_name = 'EMP';

컬럼 주석 삭제

COMMENT ON COLUMN hr.emp.employee_id IS '';
COMMENT ON COLUMN hr.emp.salary IS '';
SELECT * FROM user_col_comments WHERE table_name = 'EMP';

VIEW

  • 테이블의 뷰를 생성하여 데이터의 논리적 부분 집합 또는 조합을 나타냄
  • SELECT문을 가지고 있는 객체
  • 간접 access 제공

VIEW의 필요성

CREATE TABLE hr.emp
TABLESPACE users
AS
SELECT employee_id, last_name, department_id
FROM hr.employees;

SELECT * FROM hr.emp;

GRANT SELECT ON hr.emp TO insa;
SELECT * FROM user_tab_privs;
  • 사용자마다 권한이 다르고 볼 수 있는 정보의 수준이 다름
  • 사용자마다 권한에 맞는 데이터만 가진 테이블을 만들어주려면 스토리지가 낭비되고, 운영 관리 어려움
  • VIEW를 통해 실제 테이블을 생성하지 않고, VIEW에 저장된 SELECT문을 통해 간접적으로 접근하도록 함

VIEW 생성

CREATE VIEW hr.emp_view
AS
SELECT employee_id, last_name, department_id
FROM hr.employees;
SELECT * FROM user_objects WHERE object_name = 'EMP_VIEW';

  • OBJECT_TYPE이 VIEW로 생성됨
SELECT * FROM user_views WHERE view_name = 'EMP_VIEW';

  • TEXT 컬럼에 SELECT 문을 가지고 있음
  • VIEW를 조회하면 이 SELECT문을 실행해서 보여줌

권한이 있는 객체 정보 조회

SELECT * FROM all_objects WHERE object_name = 'EMP_VIEW';

권한이 있는 뷰 정보 조회

SELECT * FROM all_views WHERE view_name = 'EMP_VIEW';

VIEW 생성 조건

  • CREATE VIEW 권한이 있어야 함

VIEW 삭제

DROP VIEW hr.emp_view;
  • 뷰를 삭제하면 권한도 함께 회수되므로 삭제하기 전에 뷰에 대한 권한이 있는 유저를 체크해야 함
  • 뷰 수정을 위해 삭제하고 다시 만드는 경우 권한도 다시 부여해야 함

VIEW 수정

CREATE OR REPLACE VIEW hr.emp_view
AS
SELECT employee_id, last_name, department_id
FROM hr.employees;
  • 기존 뷰가 있으면 지우고 생성
  • 객체 권한은 그대로 살아있음
  • 뷰를 수정할 때는 CREATE OR REPLACE VIEW를 사용하는 것이 좋음

단순 뷰

  • 하나의 테이블에서만 데이터를 가지고 온다. 즉 조인이 없다.
  • 함수 또는 데이터에 대해 그룹을 포함하지 않는 경우
  • 뷰를 통해서 dml 작업을 수행할 수 있음

DML 권한 부여

GRANT INSERT, UPDATE, DELETE ON hr.emp_view TO insa;
SELECT * FROM user_tab_privs;
  • 뷰를 통해 insert, update, delete 가능
  • 입력 시 뷰에 없는 컬럼은 NULL로 입력
  • NOT NULL 제약조건이 있는 컬럼을 뷰가 가지고 있지 않으면 INSERT 권한이 있어도 입력 불가

  • 뷰의 컬럼이 가공된 컬럼이라면 INSERT, UPDATE 불가

복합 뷰

  • 여러 테이블에서 데이터를 가져옴, 즉 조인이 있는 경우
  • 함수, 데이터 그룹을 사용하는 경우
  • 뷰를 통한 DML 작업 수행 불가
  • 복합 뷰이지만 DML 작업을 수행하려면 트리거 프로그램으로 구현하면 됨

뷰에 CHECK 제약 조건 생성

CREATE OR REPLACE VIEW hr.emp_view
AS
SELECT id, name, dept_id
FROM hr.emp
WHERE dept_id = 20
WITH CHECK OPTION CONSTRAINT emp_view_ck;

SELECT * FROM user_constraints WHERE table_name = 'EMP_VIEW';

  • WHERE 절이 CHECK 제약 조건

CHECK 제약 조건에 의한 오류 발생

READ ONLY 뷰 생성

CREATE OR REPLACE VIEW hr.emp_view
AS
SELECT id, name, dept_id
FROM hr.emp
WITH READ ONLY;

  • WITH READ ONLY : 단순 뷰이지만 DML 작업은 불허해야 하는 경우(SELECT 만 가능)

'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글

251030 TIL  (0) 2025.10.30
251029 TIL  (0) 2025.10.29
251028 TIL  (1) 2025.10.28
251027 TIL  (0) 2025.10.27
251024 TIL  (0) 2025.10.24