# ROW ID

SELECT rowid, id, name, sal FROM test;

ROWID                      ID NAME              SAL
------------------ ---------- ---------- ----------
AAAVrdAAEAAAAJEAAA          1 a                1000
AAAVrdAAEAAAAJEAAB          2 b                 100
AAAVrdAAEAAAAJEAAC          1 a                2000
AAAVrdAAEAAAAJEAAD          5 j                3000

AAAVrd 6자리 DATA OBJECT ID  SELECT * FROM user_objects WHERE object_name = 'TEST';
DATA_OBJECT_ID : 88723      -- 고유번호
AAE 3자리 FILE ID SELECT * FROM user_segments WHERE segment_name = 'TEST';
TABLESPACE_NAME : USERS

SELECT * FROM dba_data_files;
TABLESPACE_NAME : USERS
FILE_ID : 4
AAAAJE 6자리 BLOCK ID SELECT * FROM dba_extents WHERE segment_name = 'TEST';
BLOCK_ID : 584
AAA 3자리 ROW SLOT  
총 18자리  






■ 제약 조건 체크 여부

SELECT * FROM user_constraints; DEFERRED
INITIALLY IMMEDIATE INITIALLY DEFERRED
DEFERRABLE NOT DEFERRABLE DML 수행 즉시 체크. 기본값
SET CONSTRAINTS ~ 상태 수정 불가
-
DEFERRABLE DML 수행 즉시 체크 COMMIT 수행 시 체크

 

<< HR SESSION >>


CREATE TABLE hr.emp_sal(

    salary NUMBER CONSTRAINT sal_ck CHECK(salary > 100) DEFERRABLE INITIALLY IMMEDIATE,
    bonus NUMBER CONSTRAINT bonus_ck CHECK(bonus > 0) DEFERRABLE INITIALLY DEFERRED
);


SELECT * FROM user_constraints WHERE table_name = 'EMP_SAL';
CONSTRAINT_NAME  DEFERRABLE  DEFERRED
---------------- ----------- ---------
SAL_CK           DEFERRABLE  IMMEDIATE   -- 즉시 체크
BONUS_CK         DEFERRABLE  DEFERRED    -- 즉시 체크하지 않는다


INSERT INTO hr.emp_sal (salary, bonus) VALUES (90, 5);
ORA-02290: check constraint (HR.SAL_CK) violated


INSERT INTO hr.emp_sal (salary, bonus) VALUES (101, -5);


SELECT * FROM hr.emp_sal;
    SALARY      BONUS
---------- ----------
       101         -5


COMMIT;
ORA-02091: transaction rolled back
ORA-02290: check constraint (HR.BONUS_CK) violated

# DEFERRABLE - INITIALLY DEFERRED : COMMIT 수행 시 체크
  # 현재 세션에서 제약조건을 지연가능하도록 수행하겠다는 의미
# 트랜젝션이 끝나면 자동으로 해지 된다.
# NOT DEFERRABLE 로 설정되어 있을 경우에는 수행할 수 없다.  -- DEFERRABLE 상태여야 한다.

SET CONSTRAINTS ALL DEFERRED;
또는
ALTER SESSION SET CONSTRAINT = DEFERRED;


INSERT INTO hr.emp_sal (salary, bonus) VALUES (90, 5);

INSERT INTO hr.emp_sal (salary, bonus) VALUES (101, -5);

COMMIT;
ORA-02091: transaction rolled back
ORA-02290: check constraint (HR.SAL_CK) violated


SELECT * FROM hr.emp_sal;
no rows selected

  # 현재 세션에서 bonus_ck 제약조건 여부 체크를 commit 시에 체크하도록 설정

SET CONSTRAINTS bonus_ck DEFERRED;


INSERT INTO hr.emp_sal (salary, bonus) VALUES (101, -5);

COMMIT;
ORA-02091: transaction rolled back
ORA-02290: check constraint (HR.BONUS_CK) violated

# DEFERRABLE - INITIALLY IMMEDIATE : DML 수행 즉시 체크
  # 현재 트랜잭션을 수행하는 동안 모든 제약조건 체크는 즉시체크하겠다.

SET CONSTRAINTS ALL IMMEDIATE;
또는
ALTER SESSION SET CONSTRAINT = IMMEDIATE;


INSERT INTO hr.emp_sal (salary, bonus) VALUES (101, -5);
ORA-02290: check constraint (HR.BONUS_CK) violated

# NOT DEFERRABLE - INITIALLY IMMEDIATE : SET CONSTRAINTS 상태 변경 작업을 할 수 없다.
  DROP TABLE emp_sal PURGE;

CREATE TABLE hr.emp_sal(
    salary NUMBER CONSTRAINT sal_ck CHECK(salary > 100) NOT DEFERRABLE INITIALLY IMMEDIATE,
    bonus NUMBER CONSTRAINT bonus_ck CHECK(bonus > 0) NOT DEFERRABLE INITIALLY IMMEDIATE
);


SELECT * FROM user_constraints WHERE table_name = 'EMP_SAL';
CONSTRAINT_NAME  DEFERRABLE      DEFERRED
---------------- --------------- ---------
SAL_CK           NOT DEFERRABLE  IMMEDIATE   -- 즉시 검사
BONUS_CK         NOT DEFERRABLE  IMMEDIATE   -- 즉시 검사


SET CONSTRAINTS ALL DEFERRED;
>> 오류가 없지만 적용안된다.


INSERT INTO hr.emp_sal (salary, bonus) VALUES (90, 5);
ORA-02290: check constraint (HR.SAL_CK) violated


INSERT INTO hr.emp_sal (salary, bonus) VALUES (200, -5);
ORA-02290: check constraint (HR.BONUS_CK) violated


** 제약조건은 ADD or DROP 으로 설정과 삭제는 가능하지만 수정은 불가하다.
    단, NOT NULL 제약조건은 MODIFY를 사용하여 수정 가능

# 대량의 데이터가 입력된 상태에서 제약조건을 설정하자.
  << HR SESSION >>


DROP TABLE hr.test PURGE;

CREATE TABLE test(id NUMBER, name CHAR(10), sal NUMBER);

INSERT INTO test(id,name,sal) VALUES(1,'a',1000);
INSERT INTO test(id,name,sal) VALUES(2,'b',100);
INSERT INTO test(id,name,sal) VALUES(1,'a',2000);

COMMIT;


SELECT * FROM test;
        ID NAME              SAL
---------- ---------- ----------
         1 a                1000
         2 b                 100
         a                2000


ALTER TABLE test ADD CONSTRAINT test_id_pk PRIMARY KEY(id);
ORA-02437: cannot validate (HR.TEST_ID_PK) - primary key violated

>> 제약조건에 위반된 기존 데이터가 있어 제약조건을 생성할 수 없다.


SELECT * FROM user_constraints WHERE table_name = 'TEST';
no rows selected

1. 내용 체크 없이 체크 제약 생성만 한다.
  ALTER TABLE test ADD CONSTRAINT test_id_pk PRIMARY KEY(id) DISABLE;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS       : DISABLED         -- 생성만하고 체크 비활성화
VALIDATED    : NOT VALIDATED    -- 내용체크 안함

>> 신규 및 기존 데이터의 검증 안한다.


INSERT INTO TEST(id,name,sal) VALUES(5,'j',3000);

COMMIT;


SELECT * FROM TEST;
        ID NAME              SAL
---------- ---------- ----------
         1 a                1000
         2 b                 100
         1 a                2000
         5 j                3000

2.EXCEPTIONS형식의 테이블 생성
  SQL> @$ORACLE_HOME/rdbms/admin/utlexpt1


desc exceptions
 Name    Null?     Type 
---------- -- ------------ 
ROW_ID        UROWID       
OWNER         VARCHAR2(30) 
TABLE_NAME    VARCHAR2(30) 
CONSTRAINT    VARCHAR2(30) 

3.test 테이블을 활성화하는데 문제되는 행이 있다면 exceptions 테이블에 패치
  ALTER TABLE test ENABLE CONSTRAINT test_id_pk EXCEPTIONS INTO exceptions;
ORA-02437: cannot validate (HR.TEST_ID_PK) - primary key violated


SELECT * FROM exceptions;
ROW_ID               OWNER   TABLE_NAME      CONSTRAINT
-------------------- ------- --------------- ---------------
AAAVrdAAEAAAAJEAAC   HR      TEST            TEST_ID_PK
AAAVrdAAEAAAAJEAAA   HR      TEST            TEST_ID_PK

4. row id 와 데이터 매칭
  SELECT rowid, t.*
FROM test t
WHERE rowid IN (SELECT row_id FROM exceptions);

ROWID                      ID NAME              SAL
------------------ ---------- ---------- ----------
AAAVrdAAEAAAAJEAAA          1 a                1000
AAAVrdAAEAAAAJEAAC          1 a                2000

5. 데이터 검증 -> 업무팀
  UPDATE test SET id = 6 WHERE rowid = 'AAAVrdAAEAAAAJEAAC';

COMMIT;


SELECT * FROM test;
        ID NAME              SAL
---------- ---------- ----------
         1 a                1000
         2 b                 100
         6 a                2000
         5 j                3000

6. exceptions 테이블 초기화 후 제약 설정 재적용
  TRUNCATE TABLE exceptions ;

ALTER TABLE test ENABLE CONSTRAINT test_id_pk EXCEPTIONS INTO exceptions;
>> 문제가 없다면 Table altered.


SELECT * FROM exceptions ;
no rows selected


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS      : ENABLED
VALIDATED   : VALIDATED


** DISABLE 하지않고 처음부터 ENABLE 상태에서 작업가능하다.
ALTER TABLE test ADD CONSTRAINT test_id_pk PRIMARY KEY(id) EXCEPTIONS INTO exceptions;

** 제약조건 = 트리거





■ 제약조건 상태

ALTER TABLE ~ VALIDATED
NOVALIDATE VALIDATE
STATUS DISABLED 신규 및 기존 데이터 검증 안함
(이관 작업 시)
신규 데이터 DML 작업 불허
(트랜잭션 막을 때)
ENABLED 신규 데이터만 검증 신규 및 기존 데이터 모두 검증
(운영 활성화)

DISABLED 기본값 : DISABLE NOBALIDATE 
ENABLED  기본값 : ENABLE VALIDATE

<< HR SESSION >>


SELECT * FROM user_constraints WHERE table_name = 'TEST';

SELECT * FROM  test;
        ID NAME                   SAL
---------- --------------- ----------
         1 a                     1000
         2 b                      100
         6 a                     2000
         5 j                     3000

# ENABLED NOVALIDATED : 기존 데이터는 검증하지 않고, 새로운 데이터만 검증하는걸로 생성
  ALTER TABLE test ADD CONSTRAINT test_sal_ck CHECK (sal >= 1000) ENABLE NOVALIDATE;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS      : ENABLED
VALIDATED   : NOT VALIDATED


INSERT INTO test (id,name,sal) VALUES (10,'j',500);
ORA-02290: check constraint (HR.TEST_SAL_CK) violated
>> 오류발생 체크제약조건식에 위배되었다.


SELECT * FROM test;
        ID NAME                   SAL
---------- --------------- ----------
         1 a                     1000
         2 b                      100
         6 a                     2000
         5 j                     3000

# ENABLE NOVALIDATE -> ENABLE VALIDATE : 안에 있던 데이터까지 검증하기에 기존 데이터 수정 필요
  ALTER TABLE test ENABLE [ VALIDATE ] CONSTRAINT test_sal_ck EXCEPTIONS INTO exceptions;
ORA-02293: (HR.TEST_SAL_CK)을 검증할 수 없습니다 - 잘못된 제약을 확인합니다


SELECT * FROM exceptions;
ROW_ID             OWNER   TABLE_NAME      CONSTRAINT
------------------ ------- --------------- ------------
AAAVqTAAEAAAAJMAAB HR      TEST            TEST_SAL_CK


SELECT rowid, t.*
FROM test t
WHERE rowid in (SELECT row_id FROM exceptions);
ROWID                      ID NAME              SAL
------------------ ---------- ---------- ----------
AAAVqTAAEAAAAJMAAB          2 b                 100


UPDATE test SET sal = 1001 WHERE rowid = 'AAAVqTAAEAAAAJMAAB';

COMMIT;


SELECT * FROM test;
        ID NAME              SAL
---------- ---------- ----------
         1 a                1000
         2 b                1001
         6 a                2000
         5 j                3000


TRUNCATE TABLE exceptions;


ALTER TABLE test ENABLE VALIDATE CONSTRAINT test_sal_ck EXCEPTIONS INTO exceptions;
>> 문제없다면 성공


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS      : ENABLED
VALIDATED   : VALIDATED

#  DISABLED VALIDATED : 신규 데이터 DML 작업 불가
  ALTER TABLE test DISABLE VALIDATE CONSTRAINT test_sal_ck;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS      : DISABLED      -- 제약조건 비활성화
VALIDATED   : VALIDATED     -- 내부검증한다

>>> DML 작업 불가


INSERT INTO test (id,name,sal) VALUES (10,'j',1000);
ORA-25128: No insert/update/delete on table with constraint (HR.TEST_SAL_CK) disabled and validated
ORA-25128: 사용 안함으로 설정되고 검증된 제약 조건(HR.TEST_SAL_CK)을 사용하여 테이블에서 삽입/갱신/삭제 작업이 수행되지 않았습니다.


ALTER TABLE test DISABLE NOVALIDATE CONSTRAINT test_sal_ck;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS      : DISABLED      -- 제약조건 비활성화
VALIDATED   : NOT VALIDATED -- 내부검증 안함
>>> 신규 및 기존 데이터 검증 안함


INSERT INTO test (id,name,sal) VALUES (10,'j',1000);
1 row created.



ROLLBACK;

 

** PRIMARY KEY, UNIQUE 제약조건은 ENABLE NOVALIDATE 성격을 수행하더라도
자동으로 unique index를 생성해야하기 때문에 기존 데이터에 대해서 검증을 체크한다. (중복, NULL 체크)
  DROP TABLE test PURGE;

CREATE TABLE test(id NUMBER, name CHAR(10), sal NUMBER);


INSERT INTO test(id,name,sal) VALUES(1,'a',1000);
INSERT INTO test(id,name,sal) VALUES(2,'b',100);
INSERT INTO test(id,name,sal) VALUES(1,'a',2000);

COMMIT;


SELECT * FROM hr.test;
        ID NAME              SAL
---------- ---------- ----------
         1 a                1000
         2 b                 100
         a                2000


ALTER TABLE test ADD CONSTRAINT test_id_pk PRIMARY KEY(id) ENABLE VALIDATE;
ORA-02437: cannot validate (HR.TEST_ID_PK) - primary key violated


ALTER TABLE test ADD CONSTRAINT test_id_pk PRIMARY KEY(id) ENABLE NOVALIDATE;
ORA-02437: cannot validate (HR.TEST_ID_PK) - primary key violated






# 터미널에서 EXPORT 

SQL> ! pwd
/home/oracle/spool

SQL> spool emp_sal.dat

SQL> SELECT employee_id||','||last_name||','||first_name||','||salary||','||department_id
FROM hr.employees;

SQL> spool off

SQL> ! cat emp_sal.dat
>> 데이터  외 칼럼명, 실행한 SQL문, 라인공백, 총 작업 행 수, spool off 실행문까지
    불필요한 데이터가 포함되어있다.

SQL> ! pwd
/home/oracle/spool

SQL> ! vi emp_sal.sql

set pagesize 0
set linesize 200
set echo off
set termout off
set trimspool on
set feedback off
spool emp_sal.csv
SELECT employee_id||','||last_name||','||first_name||','||salary||','||department_id
FROM hr.employees;
spool off

:wq

SQL> @emp_sal.sql

SQL> ! cat emp_sal.csv
>> 데이터만 깔끔하게 생성되었다!

SET PAGESIZE 0 한페이지로 지정할 라인 수, 0으로 설정하면 컬럼은 출력하지 않는다.
SET LINESIZE 200 한라인에 표시할 글자 수
SET ECHO OFF 실행하는 SQL문을 출력하지 않는다.
SET TERMOUT OFF SQL문으로 실행한 결과를 표시하지 않는다. (화면 미출력)
SET TRIMSPOOL ON 라인뒤 공백 제거
SET FEEDBACK OFF SQL문으로 실행한 결과 건수를 표시하지 않는다.
SPOOL file_name SQL문의 실행결과를 spool file로 생성한다. 
SPOOL OFF SQL문의 실행결과를 spool file로 생성을 멈춘다.




■ SQL LOADER
- 데이터 이관 작업하는 프로그램
- 외부파일에서 오라클 데이터베이스의 테이블로 data를 load(insert) 하는 프로그램
- sqlldr : 오라클에서 제공하는 프로그램

drop table emp_sal purge;

create table emp_sal
as
select employee_id, last_name, first_name, salary, department_id
from hr.employees
where 1 = 2;


# CONTROL FILE 생성 : emp_sal.csv -> emp_sal 테이블에 이관 작업

[oracle@oracle spool]$ vi emp_sal.ctl

UNRECOVERABLE LOAD DATA
INFILE emp_sal.csv
INSERT
INTO TABLE hr.emp_sal
FIELDS TERMINATED BY ','
(employee_id, last_name, first_name, salary, department_id)

:wq


[oracle@oracle spool]$ sqlldr hr/hr control=emp_sal.ctl direct=true
Load completed - logical record count 106.

SELECT * FROM hr.emp_sal;

 

drop table test purge;

create table hr.test(
    id number constraint test_id primary key,
    name varchar2(30),
    phone varchar2(20));

[oracle@oracle spool]$ vi insa.ctl

UNRECOVERABLE LOAD DATA
INFILE *
INSERT
INTO TABLE hr.test
FIELDS TERMINATED BY ','
(id, name, phone)
BEGINDATA
1,"JAMES","010-1000-0001"
2,"ORACLE","010-7777-7777"
3,"KIM","010-8888-8888"

:wq


[oracle@oracle spool]$ vi insa.ctl

UNRECOVERABLE LOAD DATA
INFILE *
INSERT
INTO TABLE hr.test
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(id, name, phone)
BEGINDATA
1,"JAMES","010-1000-0001"
2,"ORACLE","010-7777-7777"
3,"KIM","010-8888-8888"

:wq

[oracle@oracle spool]$ sqlldr hr/hr control=insa.ctl direct=true
Load completed - logical record count 4.

select * from hr.test;
ID NAME     PHONE
1 "JAMES"     "010-1000-0001"
2 "ORACLE" "010-7777-7777"
3 "KIM"     "010-8888-8888"

>>> 따옴표까지 값에 포함되었다!?!


truncate table hr.test;

select * from hr.test;
no rows selected

select * from hr.test;
ID NAME PHONE
1 JAMES 010-1000-0001
2 ORACLE 010-7777-7777
3 KIM     010-8888-8888









 

INSERT 비어있는 테이블에 입력할 때 사용
REPLACE 기존행을 DELETE 한 후 데이터를 입력
TRUNCATE 테이블을 TRUNCATE 한 후 새로운 데이터를 입력
> REPLACE 보다 TRUNCATE 사용하는게 리소스 절약 (복구 가능성이 없다면)
APPEND 새로운 데이터를 기존 테이블에 추가. 단, 제약조건 무시 주의

 

[oracle@oracle spool]$ vi insa.ctl

UNRECOVERABLE LOAD DATA
INFILE *
APPEND
INTO TABLE hr.test
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(id, name, phone)
BEGINDATA
1,"JAMES","010-1000-0001"
2,"ORACLE","010-7777-7777"
3,"KIM","010-8888-8888"

:wq


[oracle@oracle spool]$ sqlldr hr/hr control=insa.ctl direct=true
Load completed - logical record count 4.


SELECT * FROM hr.test;
ID  NAME    PHONE
--- ------- -------------
1   JAMES   010-1000-0001
2   ORACLE  010-7777-7777
3   KIM     010-8888-8888
1   JAMES   010-1000-0001
2   ORACLE  010-7777-7777
3   KIM     010-8888-8888

>>> 중복된 데이터가 들어간다!!


SELECT * FROM user_constraints WHERE table_name = 'TEST';
CONSTRAINT_NAME : TEST_ID
CONSTRAINT_TYPE : P
STATUS          : ENABLED           활성화
VALIDATED       : VALIDATED         신규 및 기존 데이터 모두 검증
DEFERRABLE      : NOT DEFERRABLE    CONSTRAINTS 상태 수정 불가
DEFERRED        : IMMEDIATE         DML 수행 즉시 체크

>> hr.test 테이블은 제약조건 검증이 활성화 되어있다.
>> APPEND 작업 시 제약조건이 있는 상태를 무시하고 데이터가 입력된다. 주의 필요!!


SELECT * FROM user_objects WHERE object_name = 'TEST_ID';
STATUS      : VALID  -> 사용가능하고 되어있지만 망가졌다.


SELECT * FROM user_indexes WHERE table_name = 'TEST';
STATUS      : UNUSABLE


SELECT * FROM user_cons_columns WHERE table_name = 'TEST';
COLUMN_NAME : ID


SELECT * FROM hr.test WHERE id = 1;
>> FUll SCAN 상태


# 제약조건 검증 비활성화
ALTER TABLE hr.test DISABLE CONSTRAINT test_id;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS          : DISABLED          비활성화
VALIDATED       : NOT VALIDATED     신규 및 기존 데이터 검증 안함
DEFERRABLE      : NOT DEFERRABLE    CONSTRAINTS 상태 수정 불가
DEFERRED        : IMMEDIATE         DML 수행 즉시 체크


SELECT * FROM user_indexes where table_name = 'TEST';
no rows selected

>> 비활성화 시 INDEX 정보 자동 DROP


# 검증 활성화
ALTER TABLE test ENABLE CONSTRAINT test_id;
ORA-02437: cannot validate (HR.TEST_ID) - primary key violated


TRUNCATE TABLE exceptions;


# 검증 활성화 시 에러는 exceptions 테이블에 패치
ALTER TABLE test ENABLE CONSTRAINT test_id EXCEPTIONS INTO exceptions;
ORA-02437: cannot validate (HR.TEST_ID) - primary key violated

>> 오류가 나면 exceptions 테이블을 확인하자.

SELECT * FROM exceptions;
ROW_ID             OWNER   TABLE_NAME      CONSTRAINT
------------------ ------- --------------- -----------
AAAVsiAAEAAAAJEAAA HR      TEST            TEST_ID
AAAVsiAAEAAAAJDAAA HR      TEST            TEST_ID
AAAVsiAAEAAAAJEAAB HR      TEST            TEST_ID
AAAVsiAAEAAAAJDAAB HR      TEST            TEST_ID
AAAVsiAAEAAAAJEAAC HR      TEST            TEST_ID
AAAVsiAAEAAAAJDAAC HR      TEST            TEST_ID


SELECT rowid, t.*
FROM hr.test t
WHERE rowid IN (SELECT row_id FROM exceptions);
ROWID                      ID NAME                           PHONE
------------------ ---------- ------------------------------ --------------------
AAAVsiAAEAAAAJDAAA          1 JAMES                          010-1000-0001
AAAVsiAAEAAAAJDAAB          2 ORACLE                         010-7777-7777
AAAVsiAAEAAAAJDAAC          3 KIM                            010-8888-8888
AAAVsiAAEAAAAJEAAA          1 JAMES                          010-1000-0001
AAAVsiAAEAAAAJEAAB          2 ORACLE                         010-7777-7777
AAAVsiAAEAAAAJEAAC          3 KIM                            010-8888-8888


DELETE FROM test
WHERE rowid IN ('AAAVquAAEAAAAJEAAA','AAAVquAAEAAAAJEAAB','AAAVquAAEAAAAJEAAC');

COMMIT;

SELECT * FROM hr.test;
        ID NAME                           PHONE
---------- ------------------------------ --------------------
         1 JAMES                          010-1000-0001
         2 ORACLE                         010-7777-7777
         3 KIM                            010-8888-8888


TRUNCATE TABLE exceptions;


# 검증 활성화 시 에러는 exceptions 테이블에 패치
ALTER TABLE test ENABLE CONSTRAINT test_id EXCEPTIONS INTO exceptions;


SELECT * FROM user_constraints WHERE table_name = 'TEST';
STATUS          : ENABLED           활성화
VALIDATED       : VALIDATED         신규 및 기존 데이터 모두 검증
DEFERRABLE      : NOT DEFERRABLE    CONSTRAINTS 상태 수정 불가
DEFERRED        : IMMEDIATE         DML 수행 즉시 체크


SELECT * FROM user_objects WHERE object_name = 'TEST_ID';
STATUS      : VALID


SELECT * FROM user_indexes where table_name = 'TEST';
STATUS : VALID


SELECT * FROM hr.test WHERE id = 1;
TABLE ACCESS : BY INDEX ROWID
INDEX        : UNUQUE SCAN

 


 

# 오류해결

SELECT employee_id||','||last_name||','||first_name||','||salary||','||department_id
FROM hr.employees;

ORA-28144: Failed to execute fine-grained audit handler
ORA-12899: value too large for column "HR"."FGA_LOG"."USER_SQL" (actual: 102, maximum: 100)
>> FGA  모니터링 테스트 이슈 > 모니터링 삭제


<< SYS SESSION >>

SELECT * FROM dba_audit_policies;

BEGIN
    dbms_fga.drop_policy(
            object_schema => 'hr',
            object_name => 'employees',
            policy_name => 'fga_emp_log'
    );
end;
/

 

 

'Oracle 11g > Oracle DB' 카테고리의 다른 글

59 ORACLE Listener, DB Link, Server  (1) 2024.01.05
58 ORACLE SQL Loader, Listener  (1) 2024.01.04
56-2 ORACLE 종속성  (0) 2023.12.28
55 ORACLE Audit, Trigger  (1) 2023.12.27
54-2 ORACLE Audit  (1) 2023.12.26