'Knowledge/Oracle'에 해당되는 글 30건

  1. 2015.01.22 oracle 접속 ip 차단하기
  2. 2014.12.31 dg4obbc 제약사항
  3. 2014.05.30 EZCONNECT 사용방법
  4. 2014.05.27 DB Upgrade 상식
  5. 2014.04.16 Undo tablespace shrink
  6. 2014.04.03 datapump expdp remote
  7. 2014.03.20 Datapump export in ASM
  8. 2014.03.07 About View
  9. 2014.03.07 About DBLINK
  10. 2014.03.07 About Sequence

이 트리거를 걸어둬도 유저가 dba 권한을 가지고 있으면 동작하지 않는다.

허용하는 ip가 아니면 해당 유저가 접속할 수 없도록 하는 예시

 

create or replace TRIGGER SYSTEM.LOGON_ACL
after logon
on database
WHEN (
    user='유저명'
)
declare
v_ip varchar(32);
BEGIN
    select sys_context('USERENV', 'IP_ADDRESS') into v_ip from dual;
    IF (v_ip not in ('xx.xx.xx.xx','xx.xx.xx.xx')) THEN
         RAISE_APPLICATION_ERROR(-20000, 'Access denied! You don"t have permission to login!');
    ELSIF (v_ip is null) then                                                    --db서버에서 sqlplus 방지
         RAISE_APPLICATION_ERROR(-20000, 'Access denied! You don"t have permission to login!');
    END IF;
END;

 

아니면 이렇게도 가능하다

 

create or replace TRIGGER SYSTEM.LOGON_ACL
after logon
on 유저명.schema

declare
v_ip varchar(32);
BEGIN
    select sys_context('USERENV', 'IP_ADDRESS') into v_ip from dual;
    IF (v_ip not in ('xx.xx.xx.xx','xx.xx.xx.xx')) THEN
         RAISE_APPLICATION_ERROR(-20000, 'Access denied! You don"t have permission to login!');
    ELSIF (v_ip is null) then                                                    --db서버에서 sqlplus 방지
         RAISE_APPLICATION_ERROR(-20000, 'Access denied! You don"t have permission to login!');
    END IF;
END;

 

'Knowledge > Oracle' 카테고리의 다른 글

null 관련 주의사항  (0) 2015.07.10
logon trail trigger on oracle  (0) 2015.01.22
dg4obbc 제약사항  (0) 2014.12.31
EZCONNECT 사용방법  (0) 2014.05.30
DB Upgrade 상식  (0) 2014.05.27
Posted by neo-orcl
,

무료인 oracle database gateway for odbc 사용시 아래의 제약사항이 있다.

-BLOB and CLOB data cannot be read by pass-through queries 

-Updates or deletes that include unsupported functions within a WHERE clause are not allowed 

-Does not support stored procedures 

-Cannot participate in distributed transactions; they support single-site transactions only 

-Does not support multithreaded agents 

-Does not support updating LONG columns with bind variables 

-Does not support rowids

'Knowledge > Oracle' 카테고리의 다른 글

logon trail trigger on oracle  (0) 2015.01.22
oracle 접속 ip 차단하기  (0) 2015.01.22
EZCONNECT 사용방법  (0) 2014.05.30
DB Upgrade 상식  (0) 2014.05.27
Undo tablespace shrink  (0) 2014.04.16
Posted by neo-orcl
,

EZ Connect

문법

CONNECT username/password@[//]host[:port][/service_name]

 

URL이나 JDBC 사용시

CONNECT username/password@[//][host][:port][/service_name]

 

예시

hostname이 test인 서버에 1521 포트로 orcl 서비스에 접속하는 경우

 

CONNECT username/password@test:1521/orcl
CONNECT username/password@//test/orcl
CONNECT username/password@//test.myhost.com/orcl

 

sqlnet.ora에 아래 내용 필요할 수도 있다는데 sqlnet.ora 없어도 잘 되는 것을 확인.(11gr2)
NAMES.DIRECTORY_PATH=(ezconnect, tnsnames)

'Knowledge > Oracle' 카테고리의 다른 글

oracle 접속 ip 차단하기  (0) 2015.01.22
dg4obbc 제약사항  (0) 2014.12.31
DB Upgrade 상식  (0) 2014.05.27
Undo tablespace shrink  (0) 2014.04.16
datapump expdp remote  (0) 2014.04.03
Posted by neo-orcl
,

DB Upgrade 상식

Knowledge/Oracle 2014. 5. 27. 13:26

DBUA 혹은 Manual 업그레이드를 할 경우의 시간을 줄이는 방법에 대한 상식들

1. 업그레이드 시간은 DB의 크기와는 무관계하다.

2. 업그레이드 시간은 타겟 버전에 맞게 데이터 딕셔너리 로드를 하는 과정에 달려있다.
    - 예를 들어 10gR1에서 10gR2로 업그레이드 하는 과정은 9iR2에서 10gR2로 업그레이드 하는 것보다 적은 시간이 걸리게 된다.
      이유는 딕셔너리 변경이 더 적기 때문이다.

3. PL/SQL 재컴파일 과정또한 한 단계가 되는데 오브젝트의 갯수에 따라서 더 많은 시간이 걸리게 된다.
    - 이때 CPU 성능에 따라 컴파일 과정은 더 차이가 나게 되며, parallel 옵션을 주어 시간을 더 줄일 수 있다.

4. DB 크기와 업그레이드 시간이 관계 없는 이유는 업그레이드 과정에서는 data block를 건드리지 않기 때문이다.

5. 업그레이드 과정 중 부족한, 혹은 업그레이드 과정 중 데이터가 많이 변경되었을 경우 딕셔너리 테이블에 대한 옵티마이저 통계정보를 수집하는 과정도 시간 소요에 영향을 준다.
    - 딕셔너리 테이블 갯수에 따라 이 시간은 차이가 나게 된다.
    - 이 시간을 줄이기 위해서 업그레이드 전에 먼저 통계정보를 수집하는 것이 좋다.

6. 아카이브 로그 모드로 운영중이라면 업그레이드 시에 노아카이브로 전환 후 진행한다.

'Knowledge > Oracle' 카테고리의 다른 글

dg4obbc 제약사항  (0) 2014.12.31
EZCONNECT 사용방법  (0) 2014.05.30
Undo tablespace shrink  (0) 2014.04.16
datapump expdp remote  (0) 2014.04.03
Datapump export in ASM  (0) 2014.03.20
Posted by neo-orcl
,

#############################################################################################
undo 크기가 늘어나는 이유
#############################################################################################
1. undo segment를 할당하는 방식

 

1-1. autoextend off인 경우
빈 공간이 없다면 undo_retention 값에 해당하는 segment도 재사용하게 되고 이는 snapshot too old가 발생할 수 있다.

 

1-2. autoextend on인 경우
빈 공간이 없다면 undo_retention 값에 해당하는 공간은 재사용하지 않고 데이터 파일 크기를 늘릴 수 있을 때까지 늘린다.
늘릴수 없을 정도까지 늘어났다면 이때부터 undo_retiontion 값에 해당하는 segment도 재사용하게 된다.

이 것이 undo tablespace가 커지는 주이유이다.
AUTOEXTEND ON + MAXSIZE를 적용해 크기를 제한하고 사용하는 방법이 권장된다.

 

#############################################################################################
undo tablespace shrink
#############################################################################################
1. undo tablespace를 원하는 크기로 하나 더 생성한다.
create undo tablespace undotbs2 datafile 'undotbs2.dbf' size <new size>;

 

2. undo_tablespace 파라미터를 바꾼다.
alter system set undo_tablespace=undotbs2;

 

3. 이전의 undo tablespace를 drop한다.
alter tablespace undotbs1 including contents;

 

※만약 drop시 ora-30013이 발생한다면 undo 를 사용하는 트랜잭션이 존재한다는 것이고 이를 drop하기 위해선
해당 트랜잭션이 끝나기를(commit or rollback) 기다릴 수 밖에 없다.

 

※OS에 따라서 drop했는데도 disk상의 공간이 확보가 되지 않을 수 있다(du or df).

   이때는 disk 확보가 필요하다면 db 재시작이 필요하다.

'Knowledge > Oracle' 카테고리의 다른 글

EZCONNECT 사용방법  (0) 2014.05.30
DB Upgrade 상식  (0) 2014.05.27
datapump expdp remote  (0) 2014.04.03
Datapump export in ASM  (0) 2014.03.20
About View  (0) 2014.03.07
Posted by neo-orcl
,

알고는 있었지만 테스트를 한번도 안해둬서 생각났을 때 해보고 기록을 남긴다.

tnsnames.ora의 tnsnames를 사용해 가능한줄 알았는데 계정/비밀번호가 필요해서 DB link를 통해 가능하다.

 

remote의 DB에 접속해 scott 스키마만 local에서 expdp로 받는 테스트이다.

 

1. local DB에 system으로 연결하여 remote 측으로 연결할 dblink를 만든다.
$ sqlplus system/orakle

SQL> create database link exptest
 connect to system
 identified by oracle
 using 'test';

 

※구분을 위해 local DB의 system 비밀번호는 orakle로 하였다. test는 tnsnames.ora에 설정해두었다.

 

2. dblink가 정상 동작하는지 확인한다.

 

3. directory를 생성한다.(system 유저로)
SQL> create directory pump as '/oracle/expdp';

 

4. expdp를 실행한다.
[oracle@11g expdp]$ expdp system/orakle schemas=scott network_link=test directory=pump dumpfile=scott.dmp flashback_time=sysdate

Export: Release 11.2.0.3.0 - Production on Wed Apr 2 14:45:52 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning option
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** schemas=scott network_link=test directory=pump dumpfile=scott.dmp flashback_time=sysdate
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "SCOTT"."DEPT"                              5.937 KB       4 rows
. . exported "SCOTT"."EMP"                               8.570 KB      14 rows
. . exported "SCOTT"."SALGRADE"                          5.867 KB       5 rows
. . exported "SCOTT"."BONUS"                                 0 KB       0 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /oracle/expdp/scott.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at 14:46:18

 

일단 remote는 11.2.0.4이고 local은 11.2.0.3인데 schema 단위로 가능한 것을 테스트했다.
full=y로 진행시 에러가 났는데 아마도 remote측 SGA가 너무 작은게 문제일 것으로 생각된다.

'Knowledge > Oracle' 카테고리의 다른 글

DB Upgrade 상식  (0) 2014.05.27
Undo tablespace shrink  (0) 2014.04.16
Datapump export in ASM  (0) 2014.03.20
About View  (0) 2014.03.07
About DBLINK  (0) 2014.03.07
Posted by neo-orcl
,

export를 하고 싶은데 ASM 으로 구성한 DB의 Filesystem에 공간이 없고 ASM내의 여유공간이 많을 경우에 이 방법을 사용해야 할 것이다.

 

1. 디렉토리를 만든다. 이 과정은 ASM의 특정 디렉토리에 만들 경우 필요하다.
 alter diskgroup data add directory '+data/dpump';

 

2. 디렉토리 오브젝트를 만든다.
create directory dpump as '+data/dpump';

 

3. 로그파일용 디렉토리를 만든다. 로그파일은 ASM 디스크내에 만들 수 없다는 점을 기억하자.
create directory dpump_log as '/home/oracle/dpump';

 

4. expdp를 수행한다.
expdp system/oracle directory=dpump dumpfile=expdp.dmp logfile=dpump_log:expdp.log full=y

 

5. ASM내 파일이 있는지 확인한다.

SQL> select file_number, bytes, creation_date from v$asm_file where type like 'DUMP%';

FILE_NUMBER      BYTES CREATION_
----------- ---------- ---------
        268    2572288 20-MAR-14

 

- asmcmd로도 확인 가능하다.
[grid@rac1 ~]$ asmcmd
ls
ASMCMD> DATA/
ASMCMD> cd data
ASMCMD> ls
DB_UNKNOWN/
ORCL/
dpump/
rac/
ASMCMD> cd dpump
ASMCMD> ls
expdp.dmp
ASMCMD> ls -l
Type     Redund  Striped  Time             Sys  Name
                                           N    expdp.dmp => +DATA/ORCL/DUMPSET/SYSTEMSYS_EXPORT_FULL_01_14068_1.268.842710589
ASMCMD> cd ../..
ASMCMD> ls
DATA/
ASMCMD> cd DATA/ORCL/DUMPSET/
ASMCMD> ls -l
Type     Redund  Striped  Time             Sys  Name
DUMPSET  UNPROT  COARSE   MAR 20 14:00:00  Y    SYSTEMSYS_EXPORT_FULL_01_14068_1.268.842710589

alias로 잡혀있는걸 알 수 있다. 이 alias를 지우면 원본 파일도 함께 지워진다.

ASMCMD> cd ../../dpump
ASMCMD> ls
expdp.dmp
ASMCMD> rm expdp.dmp
ASMCMD> cd ../..
ASMCMD> ls
DATA/
ASMCMD> cd data/orcl/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
TEMPFILE/
spfileorcl.ora

 

- 아예 dumpset 이라는 디렉토리가 없어졌음을 확인할 수 있다. 파일이 몇개 더 있다면 사라지지 않을 것이다.

'Knowledge > Oracle' 카테고리의 다른 글

Undo tablespace shrink  (0) 2014.04.16
datapump expdp remote  (0) 2014.04.03
About View  (0) 2014.03.07
About DBLINK  (0) 2014.03.07
About Sequence  (0) 2014.03.07
Posted by neo-orcl
,

About View

Knowledge/Oracle 2014. 3. 7. 13:33

출처:http://www.oracleclub.com/lecture/1036
########################################################################################################################
뷰의 제한 조건.
########################################################################################################################
- 테이블에 NOT NULL로 만든 컬럼들이 뷰에 다 포함이 되 있어야 한다.
- ROWID, ROWNUM, NEXTVAL, CURRVAL등과 같은 가상컬럼에 대한 참조를 포함하고 있는 뷰에는 어떤 데이터도 INSERT 할 수 없다
- WITH READ ONLY 옵션을 설정한 뷰도 데이터를 갱신 할 수 없다.
- WITH CHECK OPTION을 설정한 뷰는 뷰의 조건에 해당되는 데이터만 삽입, 삭제,수정을 할 수 있다

########################################################################################################################
뷰 문법
########################################################################################################################
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰이름
AS 서브쿼리
[with check option [constraint 제약조건]]
[with read only]

 

- FORCE : 기본 테이블 유무에 관계없이 VIEW를 생성
- WITH CHECK OPTION : VIEW에 의해 엑세스될 수 있는 행만이 입력되거나 변경될 수 있음을 지정
- WITH READ ONLY : SELECT만 가능한 VIEW 생성
- 함수를 사용한 컬럼은 반드시 ALIAS를 지정해야 한다.

########################################################################################################################
뷰 변경, 재컴파일
########################################################################################################################
뷰는 쿼리에 대한 변경이 불가능하기에 AS SELECT 옵션에 작성한 SQL을 변경하고 싶다면 해당 뷰를 재생성해야 한다.

 

뷰에 이상이 생겨 상태가 INVALID로 된 경우 재컴파일을 통해(AS SELECT가 유효해야 한다) VALID 상태로 바꿀 수 있다.
SQL> ALTER VIEW view_name RECOMFILE;

########################################################################################################################
뷰 예제
########################################################################################################################
-- 뷰 생성   
SQL> CREATE OR REPLACE VIEW name_query
     AS
       SELECT a.ename, b.dname
       FROM  emp a, dept b
       WHERE a.deptno = b.deptno
         AND b.deptno = 20;

 

-- 뷰를 이용한 조회
SQL> SELECT * FROM name_query;

ENAME                DNAME
-------------------- ----------
SMITH                RESEARCH
JONES                RESEARCH
...

 

-- 뷰 제거
SQL> DROP VIEW name_query;

########################################################################################################################
WITH CHECK OPTION
########################################################################################################################
WITH CHECK OPTION
뷰의 조건식을 만족하는 데이터만 INSERT 또는 UPDATE가 가능 하도록 하는 옵션 이다.

 
-- 부서 번호 10의 데이터를 조회 하는 뷰
SQL> CREATE OR REPLACE VIEW check_option
     AS
       SELECT empno, ename, deptno
       FROM  emp
       WHERE deptno = 10
       WITH CHECK OPTION ;
 
-- 부서 번호가 10인 사원만 INSERT, UPDATE할 수 있다.
SQL> INSERT INTO check_option(empno, ename, deptno)
     VALUES (10005, 'jain', 30);

INSERT INTO check_option(empno, ename, deptno)
            *
1행에 오류:
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다
########################################################################################################################
WITH READ ONLY
########################################################################################################################
SELECT만 가능한 VIEW를 생성 한다

 
-- 아래 뷰는 읽기만 가능하다.
SQL> CREATE OR REPLACE VIEW read_only
     AS
       SELECT empno, ename, deptno
       FROM  emp
       WHERE deptno = 10
       WITH READ ONLY;
########################################################################################################################
뷰의 정보 조회
########################################################################################################################
USER_VIEWS 데이터 사전을 통해서 뷰에 대한 정보를 조회 할 수 있다.
 
SQL> SELECT view_name, text
     FROM USER_VIEWS;   

 

'Knowledge > Oracle' 카테고리의 다른 글

datapump expdp remote  (0) 2014.04.03
Datapump export in ASM  (0) 2014.03.20
About DBLINK  (0) 2014.03.07
About Sequence  (0) 2014.03.07
User 생성시 quota 관련 주의점  (0) 2014.01.09
Posted by neo-orcl
,

About DBLINK

Knowledge/Oracle 2014. 3. 7. 13:10

#########################################################################################################################
디비링크 생성
#########################################################################################################################
create {public} database link {dblink_name}
connect to {userid}
identified by {password}
using '{connectstring}';

 

위의 connectstring은 tnsnames.ora 에 등록된 걸 사용할 수도 있고
아래처럼 직접 Connect String을 적을 수도 있다.

 

CREATE DATABASE LINK 디비링크명  
  CONNECT TO 계정명  
  IDENTIFIED BY 계정비밀번호  
  USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=호스트주소)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=서비스아이디)))';

#########################################################################################################################
디비링크 조회
#########################################################################################################################
select * from user_db_links;
select * from dba_db_links;

 

#########################################################################################################################
디비링크 암호 확인
#########################################################################################################################
select name,passwordx from sys.link$;

 

#########################################################################################################################
다른 유저를 소유자로 디비링크 생성
#########################################################################################################################
dblink는 owner.object 형식으로 만들 수가 없다.
domain 명으로 인식해버리기 때문이다.
따라서 다른 방법을 사용해야 한다.
아래처럼 프로시저를 생성해서 사용한다.

 

CREATE PROCEDURE otheruser.cre_db_lnk AS
BEGIN   
EXECUTE IMMEDIATE 'CREATE DATABASE LINK newlink '
            ||'CONNECT TO remoteuser IDENTIFIED BY pw '
            ||'USING ''remotetns''';
END cre_db_lnk;

'Knowledge > Oracle' 카테고리의 다른 글

Datapump export in ASM  (0) 2014.03.20
About View  (0) 2014.03.07
About Sequence  (0) 2014.03.07
User 생성시 quota 관련 주의점  (0) 2014.01.09
통계정보 수집 전략에 대한 가이드라인  (0) 2013.12.11
Posted by neo-orcl
,

About Sequence

Knowledge/Oracle 2014. 3. 7. 13:07

#########################################################################################################################
시퀀스 생성
#########################################################################################################################
문법
CREATE SEQUENCE sequence_name
 [INCREMENT BY n]
 [START WITH n]
 [MAXVALUE n | NOMAXVALUE]
 [MINVALUE n | NOMINVALUE]
 [CYCLE | NOCYCLE]
 [CACHE n | NOCACHE];

 

INCREMENT BY n: 증가값으로 2라고 하면 초기값에서 2만큼씩 증가한다. 음수를 쓸 수도 있으며 -1로 하면 1씩 감소한다. 기본값 1
START WITH n: 초기값을 의미한다.
MAXVALUE n: 최대값
NOMAXVALUE: 최대 10의 27승만큼 할당 가능하다.(거의 무제한)
MINVALUE n: 최소값. START WITH n의 우선순위가 더 높으며 만약 START WITH n 값이 MINVALUE n 값보다 낮다면 시퀀스 생성이 안된다.
            ORA-04006: START WITH cannot be less than MINVALUE <-- 이 에러가 난다.
NOMINVALUE: 최소값이며 -10의 26승까지 가능하다. 단, 시퀀스 생성시 start with n을 설정하지 않는다고 nominvalue의 최소값인
            -10의 26승이 사용되는 건 아니다. 에러난다.(테스해봄)
CYCLE | NOCYCLE: MAXVALUE가 설정된 상황에서 최대값에 도달할 경우 다시 START WITH n 값으로 순환할지 말지 결정한다.
                 기본값은 NOCYCLE
CACHE n| NOCACHE: CACHE 옵션 사용시 n개만큼 미리 메모리에 생성시켜 놓고 해당 시퀀스를 호줄하게 되면 메모리에서 할당하게 된다.
    기본값은 CACHE 20이다.(11g, 10g 다 테스트해봄)

 

예제)
SQL> create sequence t_seq2
  2  increment by 1
  3  start with 100
  4  nomaxvalue
  5  minvalue 50
  6  ;

Sequence created.

 

SQL> select t_seq2.nextval from dual;

   NEXTVAL
----------
       100

 

SQL> create sequence t_seq
  2  increment by 1
  3  start with 50
  4  nomaxvalue
  5  minvalue 100;
create sequence t_seq
*
ERROR at line 1:
ORA-04006: START WITH cannot be less than MINVALUE

 

기본값으로 생성 예제)
create sequence t_seq4 start with 1;

 

확인해보면 아래처럼 cache_size는 20, maxvalue는 nomaxvalue로, minvalue는 start with 값을 따라가고, increment by 는 1이 되었다.
그리고 nocycle이다.

 

SQL> SELECT * FROM DBA_SEQUENCES WHERE SEQUENCE_NAME like 'T_SEQ%';

 

SEQUENCE_OWNER SEQUENCE_NAME MIN_VALUE  MAX_VALUE INCREMENT_BY  C O CACHE_SIZE LAST_NUMBER
-------------- ------------- ---------- ---------- ------------ - - ---------- -----------
SYS            T_SEQ4        1          1.0000E+27 1            N N         20          21

#########################################################################################################################
시퀀스 변경
#########################################################################################################################
문법
ALTER SEQUENCE sequence_name
 [INCREMENT BY n]
 [MAXVALUE n | NOMAXVALUE]
 [MINVALUE n | NOMINVALUE]
 [CYCLE | NOCYCLE]
 [CACHE n | NOCACHE];

 

create랑 비슷하지만 start with n 이 없다. 즉 start with는 변경 불가능하다.

예제
alter sequence t_seq
 increment by 2
 maxvalue 20000
 cache 10
 nocycle;

#########################################################################################################################
시퀀스 삭제
#########################################################################################################################
DROP SEQUENCE sequence_name;


#########################################################################################################################
시퀀스 정보 확인
#########################################################################################################################
select * from dba_sequnces;

 

이중에서 몇개만 설명한다.

CYCLE_FLAG: cycle nocycle 여부이다.
ORDER_FLAG: 시퀀스 증가시 오름차순인지 내림차순인지 여부...인데 increment by -1로 바꿔도 변경되지 않음을 확인했다. 좀 더 확인 필요.
LAST_NUMBER: 디스크에 내려써진 마지막 시퀀스 넘버. 만약 캐쉬를 사용한다면 이 값은 CURRVAL + CACHE_SIZE 일 것이다.
#########################################################################################################################
시퀀스 사용
#########################################################################################################################
NEXTVAL과 CURRVAL이 존재한다.

NEXTVAL: 다음 번호
CURRVAL: 현재 번호

주의할 점은 NEXTVAL을 조회할 때마다 INCREMENT BY n 만큼 바로 증가한다는 점이다.
또한 시퀀스 생성 후 맨 처음에는 CURRVAL을 조회할 수 없다. 한번은 NEXTVAL을 조회해야 CURRVAL 조회가 가능하다.

 

NEXTVAL과 CURVAL을 사용할 수 있는 조건
- 서브쿼리가 아닌 SELECT 문의 SELECT LIST에 사용
- INSERT절에 있는 서브쿼리의 SELECT LIST에 사용
- INSERT절의 VALUES 절에 사용
- UPDATE절의 SET절에 사용

 

사용할 수 없는 조건
- 뷰의 SELECT LIST
- DISTINCT가 있는 SELECT문
- GROUP BY 또는 ORDER BY 가 있는 SELECT문
- 서브쿼리

 

사용예시
SELECT 시퀀스이름.CURRVAL FROM DUAL;
SELECT 시퀀스이름.NEXTVAL FROM DUAL;
#########################################################################################################################
시퀀스 실무
#########################################################################################################################
스퀀스 공백이 발생하는 경우가 흔하다. 이유는 아래와 같다
- 시퀀스를 호출한 후 해당 번호를 사용하지 않았을 경우
- DB 인스턴스가 비정상 종료되었을 경우

 

예를 들어 시퀀스 호출 후 커밋하지 않고 롤백한다면 해당 번호는 영원히 사용하지 못하게 된다.
CACHE 옵션을 10으로 설정했다면 메모리에 항상 10개의 시퀀스 번호를 할당해 놓는데 DB 인스턴스가 비정상 종료된다면 해당 10개의
번호는 다시 할당받을 수 없다.

 

따라서 번호 공백이 해당 업무에 영향을 미칠 수 있다면 시퀀스 생성시 nochache 옵션으로 설정해야 하며, 하나의 번호도 공백이
없어야 한다면 시퀀스 사용을 자제하고 인덱스나 번호 할당 테이블 등을 이요하는 것도 고려해야 한다.

 

* 인덱스를 사용한 부서별 번호 할당
부서별로 사원번호를 할당해야 한다고 하자. 시퀀스를 이용한다면 부서 개수만큼 시퀀스가 존재해야만 한다. 해당 회사에 50개의
부서가 있다면 시퀀스는 50개가 생성되어 부서별로 서로 다른 시퀀스를 이용해야만 할 것이다.
이 경우 다음과 시퀀스 관리 어려움 등의 문제가 발생할 수 있다.

 

부서번호+번호로 인덱스를 생성한다면 다음과 같이 SQL을 수행함으로써 각 부서별 다음에 할당될 번호를 추출할 수 있다.

 

select /*+ index_desc(사원,사원 인덱스) */
 nvl(max(번호),0)+1
 from 사원 where 부서번호='10' and rownum=1;

 

#########################################################################################################################
시퀀스 공백 테스트

#########################################################################################################################

SQL> @1

SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------- ------------ - - ---------- -----------
SYS                            T_SEQ4                                  1 1.0000E+28            1 N N         20           1
SYS                            T_SEQ2                                  1 1.0000E+28           -1 N N         20          79
SYS                            T_SEQ3                                  1 1.0000E+28            1 N N          0           1

SQL> select t_seq2.currval from dual;

   CURRVAL
----------
        97

SQL> shutdown abort;
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area  409194496 bytes
Fixed Size                  2228864 bytes
Variable Size             385879424 bytes
Database Buffers           16777216 bytes
Redo Buffers                4308992 bytes
Database mounted.
Database opened.
SQL> @1

SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------- ------------ - - ---------- -----------
SYS                            T_SEQ4                                  1 1.0000E+28            1 N N         20           1
SYS                            T_SEQ2                                  1 1.0000E+28           -1 N N         20          79
SYS                            T_SEQ3                                  1 1.0000E+28            1 N N          0           1

SQL> select t_seq2.currval from dual;
select t_seq2.currval from dual
       *
ERROR at line 1:
ORA-08002: sequence T_SEQ2.CURRVAL is not yet defined in this session


SQL> select t_seq2.nextval from dual;
   NEXTVAL
----------
        79

SQL> @1
SEQUENCE_OWNER                 SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ------------------------------ ---------- ---------- ------------ - - ---------- -----------
SYS                            T_SEQ4                                  1 1.0000E+28            1 N N         20           1
SYS                            T_SEQ2                                  1 1.0000E+28           -1 N N         20          59
SYS                            T_SEQ3                                  1 1.0000E+28            1 N N          0           1

97~80 의 공백이 생겼다.

'Knowledge > Oracle' 카테고리의 다른 글

About View  (0) 2014.03.07
About DBLINK  (0) 2014.03.07
User 생성시 quota 관련 주의점  (0) 2014.01.09
통계정보 수집 전략에 대한 가이드라인  (0) 2013.12.11
Procedure Debug 권한 부여  (0) 2013.06.26
Posted by neo-orcl
,