2010년 10월 19일 화요일

Oracle_030. Triggers #1 - BEFORE_AFTER INSERT

Page 30. Triggers

  #1.
  이번에 원래 Import Data Pump 에 대해 사용했던 방법을 기술하려 했지만, 이번에 트리거를 작성할 일이 생겨서 Trigger 에 대하여 좋은 샘플이 있기에 무단으로 퍼옵니다. ' -';;
  트리거란 INSERT, UPDATE, DELETE 같은 DML 작업이 수행할때 DML 작업의 전후에 특정한 작업이 일어나게 설정해 놓는것을 말합니다.  예를들어 중요한 테이블에 DELETE를 수행하게 되면 DELETE 가 수행되기 전에 DELETE 될 행을 미리 트리거 테이블에 기록해 놓을 수 있습니다. 그래서 추후 복구할때 트리거 테이블을 참조하면 쉽게 복구가 가능하게 됩니다.

  #2-1.
  BEFORE INSERT Trigger.
  글자 그대로 Insert 작업 수행전에 일어나는 행위입니다. 다음은 Syntax 입니다.

    CREATE OR REPLACE TRIGGER TRIGGER_NAME
    BEFORE INSERT ON TABLE_NAME
       [ FOR EACH ROW ]
    DECLARE
        -- variable declarations
    BEGIN
        -- trigger code
    EXCEPTION
        WHEN ...
       -- exception handing
    END;

    TRIGGER_NAME 은 만들 트리거 이름입니다.
    다음은 해당 트리거의 제한사아이라고 합니다.
  • 뷰에는 Before Trigger 를 생성할 수 없습니다.
  • :NEW 값을 업데이트 할 수 있다고 하네요.
  • :OLD 값은 업데이트 할 수 없습니다.
  다음은 예제입니다. 다음과 같은 테이블을 생성했다고 가정합니다.

    CREATE TABLE ORDERS  (
        ORDER_ID           NUMBER(5),
        QUANTITY           NUMBER(5),
        COST_PER_ITEM NUMBER(6,2),
        TOTAL_COST      NUMBER(8,2),
        CREATE_DATE    DATE,
        CREATED_BY      VARCHAR2(10)
     );

  BEFORE INSERT 트리거는 다음과 같이 만들 수 있습니다.

    CREATE OR REPLACE TRIGGER ORDERS_BEFORE_INSERT
    BEFORE INSERT ON ORDERS
         FOR EACH ROW
    DECLARE
         v_username  varchar2(10);
    BEGIN
         -- 테이블에 인서트 작업을 수행하는 사용자 명을 찾습니다.
         SELECT username INTO v_username
         FROM DUAL;
         -- CREATE_DATE 컬럼을 현재 시스템 날짜로 업데이트 합니다.
         :new.create_date := sysdate;
         :new.created_by := v_username;
    END;

  #2-2
  AFTER INSERT Trigger
  인서트 작업 이후에 일어납니다. Syntax 는 다음과 같습니다.

    CREATE OR REPLACE TRIGGER TRIGGER_NAME
    AFTER INSERT ON TABLE_NAME
       [ FOR EACH ROW ]
    DECLARE
        -- variable declarations
    BEGIN
        -- trigger code
    EXCEPTION
        WHEN ...
       -- exception handing
    END;

  다음은 예제입니다.

    CREATE OR REPLACE TRIGGER ORDERS_BEFORE_INSERT
    BEFORE INSERT ON ORDERS
         FOR EACH ROW
    DECLARE
         v_username  varchar2(10);
    BEGIN
         -- 테이블에 인서트 작업을 수행하는 사용자 명을 찾습니다.
         SELECT username INTO v_username
         FROM DUAL;
         -- 추적테이블에 인서트 되는 행을 넣습니다..
         INSERT INTO orders_audit
         ( order_id, quantity, cost_per_item, total_cost, username )
         VALUES
         ( :new.order_id,
           :new.quantity,
           :new.cost_per_item,
           :new.total_cost,
           v_username );
    END;

 

2010년 10월 15일 금요일

ORACLE_029. UTILITY - DATA PUMP #1 - EXPDP

PAGE 29 DATA PUMP #1 - EXPORT DATA PUMP

 #1
  데이터를 EXPORT/IMPORT 할 일들이 최근 많아졌습니다. 그래서 그런지 대용량 TABLE 을 적재할때는 그 소요되는 시간하며, DUMP 파일로 떨구는데도 굉장히 오랜 시간이 걸리던 터라 결국 다른 방법을 찾아보게 되었습니다.  그래서 이번에 데이터 펌프를 처음으로 사용해 보았는데 그 속도에 아주 만족하고 있습니다.

  실제 사용했던 DATA PUMP 사용법을 이곳에 기록으로 남겨 나중에 참고할 수 있도록 해야겠네요. 혹시나, 검색을 통해 이 문서를 보시는 분들께서도 좋은 참고자료가 되길 바래봅니다.

 #2
  EXPORT DATA PUMP 는 종전의 EXPORT 와는 조금 다른 인터페이스 방식으로 작동되는 것 같습니다. 예전 EXPORT 의 경우엔 콘솔상에서 BREAK 신호를 보내면 아예 EXPORT 자체가 중단되어 버렸었죠. 하지만 DATA PUMP 는 INTERACTIVE 상태로 들어갑니다. 거기서 추가적으로 병렬처리 값을 증가시켜준다던지등 여러가지 값을 새로이 설정해서 수행할 수 있습니다. 정말 이 병렬처리가 된다는 것이 너무 편리합니다. 게다가 TABLESPACE 를 REMAP 시킬 수 있어 LOB 컬럼이 있다 하더라도 문제 없이 데이터 적제가 가능해 집니다.
  참고로 EXPORT 를 통해 받은 DUMP 파일은 IMPORT DATA PUMP에서 사용할 수 없습니다. 역으로 DATA PUMP 를 통해 받은 DUMP 파일 역시 일반 IMPORT 로 적재가 불가능 하다고 하니 참고하시기 바랍니다.

 #3
  EXPORT DATAPUMP 는 다음의 모드중 한가지 모드를 사용합니다. 일반 EXPORT 와 마찬가지로 각각의 모드는 중복해서 사용할 수 없습니다.
  • FULL - 전체 DATABASE 를 EXPORT 합니다. (EXP_FULL_DATABASE 권한 필요)
  • SCHEMAS - 스키마 단위로 EXPORT 를 수행합니다.
  • TABLES - 해당 테이블만 EXPORT 합니다.
  • TABLESPACES - 테이블 스페이스를 EXPORT 합니다.
  EXAMPLE)
    # expdp schemas=scott
    # expdp tables=scott.employees

 #4
  모드를 설정했다면 이제 받을 덤프파일명등 그외 옵션들을 설정해 주어야 합니다.
  • DUMPFILE - 떨궈질 파일명을 지정합니다. 파일명에 %U 옵션을 붙이면 01-99 번까지 자동으로 번호가 붙습니다. %U는 병렬로 받을시, 파일명을 일일이 열거할 필요가 없어 편리합니다. :)
  • STATUS - 진행 상황을 보여줍니다. 단위는 초 입니다. 20으로 설정하면 20초마다 진행되는 상황을 보여줍니다.
  • LOGFILE - 로그를 기록할 파일명을 지정합니다.
  • FILESIZE - 떨어질 덤프파일의 최대 용량을 지정합니다. 파일명을 여러개 지정했다면 첫번째 지정된 파일이 꽉 찼을경우 두번째 파일에 기록합니다. %U로 파일명을 지정하면 오라클이 알아서 숫자를 붙여줍니다.
  • QUERY - 해당 조건에 해당하는 ROW들만 EXPORT 합니다. (QUERY=\"WHERE EMP_ID=3727\") - Unix 계열일 경우 이처럼 Escape 문자가 필요합니다.
  • JOB_NAME - 해당 EXPORT DP작업명을 지정합니다. 지정하지 않을경우 오라클이 임의로 작업명을 붙여줍니다.
  • PARALLEL - 병렬처리 갯수를 지정합니다. 병렬처리를 4개로 했다면 DUMPFILE 옵션에도 파일을 4개 지정해야 합니다. %U를 지정했다면 오라클이 알아서 번호를 붙여 생성합니다.
  • EXCLUDE / INCLUDE - 특정 오브젝트들을 제외하거나 포함시킬 수 있습니다.
    VIEW, PACKAGE, PROCEDURE, FUNCTION, GRANT, TRIGGER,
    CONSTRAINT, REF_CONSTRAINT

    (EXCLUDE = Object_type:Obj_name,...)
    (EXCLUDE = INDEX:"LIKE 'DEPT%'")
  • DIRECTORY - 덤프를 받을 디렉토리명을 지정합니다. 디렉토리를 지정하는 방법은 밑에 기술하도록 하겠습니다.
  • NETWORK_LINK - 원격지에 있는 DB의 데이터를 EXPORT 받을때 사용합니다. TNS 명이 아닌 DBMS상에 있는 DATABASE LINK 명을 사용합니다. 단 원격 DATABASE 로 접속하는 해당 계정이 EXPORT 권한을 가지고 있어야 합니다. (계정은 DATABASE LINK 생성시 지정하는거 아시죠?)
  • TRANSPORT_TABLESPACES - Y 지정시 TTS 모드가 됩니다.
 #5
  DATA PUMP 를 사용하기 위해서는 오라클 내부적으로 DIRECTORY 를 선언해 주어야 합니다. 이 디렉토리에 관련된 뷰는 DBA_DIRECTORIES 를 조회하면 현재 지정된 디렉토리들을 볼 수 있습니다. 다음 구문은 디렉토리를 생성하는 방법입니다.

  SQL> CREATE DIRECTORY PUMPDIR AS '/data/pump';

  CREATE DIRECTORY <DIRECTORY_NAME> AS <Real directory Path> 가 기본 형식입니다. 실제 디렉토리를 생성후 오라클에서 그 디렉토리에 EXPORT 받겠다는 것이죠. 디렉토리가 생성되었다면 EXPORT 를 수행할 스키마에 대해 해당 디렉토리에 읽고 쓸 수 있는 권한을 주어야 합니다.

  SQL> GRANT READ, WRITE ON DIRECTORY PUMPDIR TO SCOTT;

  이렇게 해당 계정에 디렉토리에 대한 권한을 제공하고 이제 EXPORT DATA PUMP 를 수행해 주면 됩니다.

 #6
  일반적인 DATA PUMP 를 수행하기 위한 기본 지식은 이제 다 갖추게 된 것 같군요. 대충 어떤 식으로 받는지 샘플을 통해서 알아보도록 하지요.

  1. 전체 DATABASE EXPORT  
    expdp dba/dba full=y dumpfile=fullexp_%U.dmp directory = pumpdir logfile=fullexp.log parallel=10 status = 20

  2. 특정 테이블 파티션 EXPORT
    expdp dba/dba tables=scott.employees:partition03 dumpfile=expdp_%U.dmp directory = pumpdir logfile=partition.log parallel=5 status = 20

  3. 인덱스를 제외한 테이블 EXPORT
    expdp dba/dba tables=scott.department dumpfile=department_%U.dmp directory=pumpdir logfile=department.log parallel = 5 exclude=index

 #7
  DATA PUMP 의 모든 사용방법을 알아본건 아니지만 적어도 이정도 옵션들만 알고 있다면, 그리 큰 문제는 없을거라 생각됩니다. 받은 DUMP 파일을 이용해 IMPORT DATA PUMP 를 사용할시 테이블 스페이스를 변경해서 올린다던지, 혹은 스키마를 변경해서 올린다든지 하는 옵션이 매우 간결하고 편리합니다.  다음 포스팅때에는 IMPORT DATA PUMP 에 관해서 이번처럼 간단히 알아보는 방법을 기록해 보겠습니다.


FALLENSTAR.