2010. 3. 22. 18:37

[Oracle] sqlnet.ora

Sqlnet.ora 파일은 클라이언트가 오라클 서버로 어떻게 접속할 것인가를 설정하는 파일입니다.

- 파일 위치 : %ORACLE_HOME%\NETWORK\ADMIN

- Sqlnet.ora 파일 내의 NAMES.DIRECTORY_PATH 파라미터는 오라클 클라이언트가 데이터베이스 접속 시 별칭(String name alias)의   확인하는 순서를 지정 합니다.  (TNSNAMES(로컬네임서버), ONAMES(오라클네임서버), HOSTNAME(호트스네임서버)) ->TNSNAMES(로컬네임서버) : tnsnames.ora 파일의 정보를 이용

  Ex) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

예를 들어 다음과 같이 입력할때
sqlplus scott/tiger@aaa

SQL*Plus 유틸리티는 sqlnet.ora 파일의 NAMES.DIRECTORY_PATH 항목을 이용하여 aaa Alias에 대한 해석을 하게 됩니다.
먼저 클라이언트는 tnsnames.ora 파일을 사용하여 오라클의 이름(Alias)에 해당 하는 데이터베이스가 어디에 있는 건지 확인합니다.
만약 tnsnames.ora 파일에 이름이 없다면, 클라이언트는 오라클 이름 서버(Oracle Names server)를 사용하여 Alias를 해석 할려고 하며
현재 오라클 이름 서버 대신에 LDAP(Lightweight Directory Access Protocol)의 사용을 권장한다.
마지막으로 클라이언트는 DNS나 네트워크 정보 서비스(NIS)와 같은 호스트 이름 풀이 방법을 통해 이름 해석을 시도 합니다.

- Sqlnet.ora 파일내의 SQLNET.AUTHENTICATION_SERVICES 파라미터는 클라이언트가 오라클 서버로 접속할 때, 오라클이 어떠한 인증 서비스를 사용할 것인가를 나타 냅니다. 기본적으로 오라클 9i와 오라클 8i는 다음과 같은 설정으로 윈도우 인증이 가능하다.  (NTS: 윈도우인증, NONE:일반)

  Ex) SQLNET.AUTHENTICATION_SERVICES= (NTS)

오라클 계정 접속과 윈도우 인증 방식 모두 지원하려면, 서버의 Sqlnet.ora 파일내의 SQLNET.AUTHENTICATION_SERVICES  파라미터를 다음과 같이 수정 합니다.

SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS)

만약 인증모드를 NONE으로 설정하면 sys 계정으로 로그인 시 반드시 암호를 입력해야 합니다. 즉 sqlplus /nolog -> SQL> connect / as sysdba; 라고 접속이 불가능합니다. 이는 보안상 일종의 접근제어에 해당된다고 할 수 있겠죠.

- AUTOMATIC_IPC = ON

AUTOMATIC_IPC = { ON | OFF }
위 parameter는 "SQLNET.ORA"파일에 설정할 수 있으며 ON으로 되어 있는경우 SQL*Net이 같은 alias정보를 가진 local database가 있는지 check하게 됩니다. 만일 local database가 있다면 connection은 network layer를 건너뛰고 local -Inter Process Communication(IPC)- connection을 맺게 됩니다. 따라서 이 setting은 database server쪽에 사용할 수 있는 것이지 client machine SQL*Net에는 아무 쓸모 없습니다. database server쪽에 사용하더라도 local database에 SQL*Net connection이 반드시 필요한 경우가 아니라면 사용하시 않는 것(OFF로 설정) 이 좋습니다.

- TRACE_LEVEL_CLIENT = OFF

client쪽에 trace 설정 방법입니다. client쪽 sqlnet.ora file에 다음을 setting하면 됩니다.

TRACE_LEVEL_CLIENT = 0
TRACE_DIRECTORY_CLIENT = $ORACLE_HOME/network/trace (UNIX)
TRACE_FILE_CLIENT = client

그리고 sqlplus로 접속해 보시면 에러가 나시면서 $ORACLE_HOME/network/trace 에 client.trc 파일이 생길 것입니다.

server쪽에 trace 설정 방법입니다. server쪽 sqlnet.ora file에 다음을 setting하고 listener를 다시 시작 합니다.

UNIX일 경우
TRACE_LEVEL_SERVER = 0
TRACE_DIRECTORY_SERVER = $ORACLE_HOME/network/trace
TRACE_FILE_SERVER = SERVER

윈도우일 경우
TRACE_LEVEL_SERVER = 0
TRACE_DIRECTORY_SERVER = C:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN
TRACE_FILE_SERVER = SERVER

그리고 sqlplus로 접속해 보시면 에러가 나시면서 $ORACLE_HOME/network/trace 에 client.trc 파일이 생길 것입니다.

- NAMES.DEFAULT_DOMAIN = WORLD

- NAME.DEFAULT_ZONE = WORLD

- SQLNET.EXPIRE_TIME = 0

  Netware를 제외한 모든 Platform, Protocol에서 지원이 된다.

# Windows NT 에서 KeepAlive 를 지정하는 방법(타 플랫폼은 제외)
Regedt32 를 실행한다. 레지스트리에서 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters까지
이동한다. 여기서 키 추가가 아닌 값 추가를 한다. 파라미터는  KeepAliveTime (REG_DWORD) 로 입력한다.
값은 Decimal  -> 180000 (for example = 3 minutes) 으로 지정한다.

- TCP.NODELAY=YES 

이 parameter "network\admin" (oracle8의 경우 "NET80\ADMIN") directory에 있는 "PROTOCOL.ORA"라는 파일에 추가한다.  

대부분의 경우 TCP/IP 정보는 network을 통하여 최소한 하나의 완전한 packet이 구성될 때가지 버퍼링이 된 후 보낸다.  
즉, 이 의미는 어떤 경우의 명령어들은 직접 발행이 되지 않고 TCP/IP 정보를 보낼 수 있을 때까지 버퍼링이 유지된다. 이는 잠재적으로
timeouts 또는  에러를 유발할 수 있다.  이러한 에러를 피할 수 있도록 TCP.NODELAY를 이용하여 OFF를 시키면 된다.

tcp.nodelay = yes

2010. 3. 16. 20:57

[Oracle] Windows 서버에서 오라클 Thread 죽이기

동시 트랜잭션이 많이 몰려 있는 상태이거나 트랜잭션이 길다면

세션을 kill 해도 말씀하신대로 세션의 상태가 완전히 kill 되지는 않습니다.

 

 Windows는 Thread 개념으로 운영 됩니다.

즉 한개의 oracle process안에 여러개의 thread를 통하여 운영합니다.

Unix 상의 oracle process는 windows의 thread에 해당 됩니다.

1) 해당 session에 대한 THREAD ID를 찾습니다.

아래에서 spid가 thread id가 됩니다.


SELECT SPID, OSUSER, S.PROGRAM
FROM V$PROCESS P, V$SESSION S
WHERE P.ADDR = S.PADDR
and S.SID=<sid number>;


2) orakill utility를 사용하여 Thread 를 kill 합니다.

C:> orakill ORACLE_SID thread

ORACLE_SID = 대상이 되는 오라클 인스턴스
thread = kill하고 싶은 thread id

 

[펌] 데이타베이스 사랑넷

2010. 3. 15. 13:45

[Oracle] TNANAMES.ORA 설정 및 TOAD 연결

1. TNANAMES.ORA 설정

TEST =  
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = 
              (PROTOCOL = TCP)
                  (HOST = 192.168.11.88)
                  (PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = test)
    )
)

TEST : 접속할 DB 의 이름

PROTOCOL = TCP : 접근 할 프로토콜

HOST = 192.168.11.88 : 서버의 IP 주 소

PORT = 1521 : 접근 할 포트

SERVICE_NAME = test : SID  


2. TOAD 연결
 
  - Database : tnsnames.ora 파일에서 지정한 DB 의 이름을 선택 할 수 있다.
 
  - tnsnames.ora 파일의 DB 명을 수정 하면 Database 에서 나오는 DB 의 명이 추가 된다.

  - User / Password :
오라클 서버의 사용자 아이디와 패스워드를 선택한 후 Connection을 눌러 서버에 접속을 한다.

'Database / Sql' 카테고리의 다른 글

[Oracle] sqlnet.ora  (0) 2010.03.22
[Oracle] Windows 서버에서 오라클 Thread 죽이기  (0) 2010.03.16
[MS-SQL] 다른 테이블 조인해서 UPDATE 하기  (0) 2010.03.03
ntwdblib.dll  (1) 2009.11.30
[MS-SQL] 함수 모음 및 사용법  (1) 2009.11.23
2010. 3. 3. 21:03

[MS-SQL] 다른 테이블 조인해서 UPDATE 하기

UPDATE TABLE1

SET RESULT = B.RESULT

FROM TABLE1 A JOIN TABLE2 B ON A.CODE = B.CODE

WHERE .....
2009. 11. 30. 19:21

ntwdblib.dll

외부에서 MS-SQL을 OLEDB형식으로 연결하기 위해 DLL 파일이 필요합니다.

이 DLL파일은 MSSQL 2000에서 제공되는 SQL Server Client Library 파일이지만

MSSQL 2005에서도 이용할 수 있습니다.
 

이 파일은 ER-WIN이나, PHP에서 MSSQL을 연결하기 위해서도 필요하지만

기타 IDE 등에서도 위 DLL 파일이 필요한 경우가 많습니다. 

※ 파일명을 반드시 ntwdblib.dll 로 변경해서 C:\Windows\System32 폴더에 넣어준다. 

만약 이 파일을 넣어주고도 해결되지 않을경우

Microsoft Update site 로 접속하셔서 MDAC최신버젼을 설치하시면 됩니다.


[출처] ntwdblib.dll|작성자 박군

2009. 11. 23. 09:58

[MS-SQL] 함수 모음 및 사용법

1)  Ascii() - 문자열의 제일 왼쪽 문자의 아스키 코드 값을 반환(Integer)
예) SELECT Ascii('abcd')    결과 >> a의 아스키 코드값인 97 반환 

2) Char() - 정수 아스키 코드를 문자로 반환(Char)
예) SELECT Char(97)   결과 >> a 반환 

3) Charindex() - 문자열에서 지정한 식의 위치를 반환
예)  SELECT Charindex('b','abcde')      결과 >>  2
      SELECT Charindex('b','abcde',2)   
결과 >>  2
      SELECT Charindex('b','abcde',3)    
결과 >> 

       -- 인수값이 3개일때 마지막은 abcde 에서의 문자열 검색 시작위치를 말하며
            2
인경우는 bcde 라는 문자열에 대해서 검색
            3
인 경우는 cde 라는 문자열에 대해서 검색 하게 된다. 

4) Difference() - 두 문자식에 SUONDEX  값 간의 차이를 정수로 반환
예)  SELECT Difference('a','b') )  결과 >> 3

5) Left() - 문자열에서 왼쪽에서부터 지정한 수만큼의 문자를 반환
예)  SELECT Left('abced',3)       결과 >> 3 

6) Len() - 문자열의 길이 반환
예) SELECT Len('abced')         결과>>5 

7) Lower() - 대문자를 소문자로 반환
예) SELECT Lower('ABCDE')    결과 >> abcde 

8) Ltrim() - 문자열의 왼쪽 공백 제거
예)  SELECT Ltrim('   AB  CDE')    결과>> AB CDE 

9)Nchar()  - 지정한 정수 코드의 유니코드 문자 반환
예)  SELECT Nchar(20)       결과  >>    

10) Replace -  문자열에서 바꾸고 싶은 문자 다른 문자로 변환
예) SELECT Replace('abcde','a','1')    결과>>1bcde 

11) Replicate()  - 문자식을 지정한 횟수만큼 반복
예) SELECT Replicate('abc',3)              결과>> abcabcabc 

12) Reverse() - 문자열을 역순으로 출력
예)   SELECT Reverse('abcde')             결과>> edcba 

13) Right()  - 문자열의 오른쪽에서 부터 지정한 수 만큼 반환(Left() 와 비슷 )
예) SELECT Right('abcde',3)                 결과>> cde 

14)Rtrim()  - 문자열의 오른쪽 공백 제거
예) SELECT Rtrim(' ab cde  ')               결과>>  ' ab cde'  <-- 공백구분을위해 ' 표시 

15)  Space()  -  지정한 수만큼의 공백 문자 반환
예)  SELECT Space(10)                  결과 >>  '         '   -- 그냥 공백이 나옴
     
확인을 위해서  SELECT 'S'+Space(10)+'E'   결과 >> S        E    

16) Substring()  -  문자,이진,텍스트 또는 이미지 식의 일부를 반환
예) SELECT Substring('abcde',2,3)      결과>>  bcd 

17)Unicode() - 식에 있는 첫번째 문자의 유니코드 정수 값을 반환
예)SELECT Unicode('abcde')              결과 >> 97 

18)Upper() - 소문자를 대문자로 반환
예) SELECT Upper('abcde')              결과>> ABCDE 

19) Isnumeric - 해당 문자열이 숫자형이면 1 아니면 0을 반환 >> 숫자 : 1  , 숫자X :0
예) SELECT Isnumeric('30')       결과 >> 1
     SELECT Isnumeric('3z')        결과 >> 0
 

20) Isdate()  - 해당 문자열이 Datetime이면 1 아니면 0
>> 날짜 : 1   , 날짜 X :0
예) SELECT Isdate('20071231')    결과 >> 1
     SELECT Isdate(getdate())      결과 >> 1

     SELECT Isdate('2007123')      결과
>> 0
     SELECT Isdate('aa')              결과 >> 0
 

※ 날짜및 시간함수 정리 

getdate()  >> 오늘 날짜를 반환(datetime) 
1> DateAdd()   - 지정한 날짜에 일정 간격을 + 새 일정을 반환

예) SELECT Dateadd(s,2000,getdate())  
2> Datediff()  - 지정한 두 날짜의 간의 겹치는 날짜 및 시간 범위 반환

예)SELECT DateDiff(d,getdate(),(getdate()+31)) 
3> Datename() -지정한 날짜에 특정 날짜부분을 나타내는 문자열을 반환

예) SELECT Datename(d,getdate()) 
4> Datepart() -지정한 날짜에 특정 날짜부분을 나타내는 정수를  반환

예) SELECT Datepart(d,getdate()) 
>> Datename , Datepart 은 결과 값은 같으나 반환 값의 타입이 틀림.
 

5> Day() -지정한 날짜에 일 부분을 나타내는 정수를  반환
예) SELECT Day(getdate())       -- 일 반환
     SELECT Month(getdate())   -- 월 반환
      SELECT Year(getdate())       --  년 반환
 

6> Getutcdate() -현재 UTC 시간을 나타내는 datetime 값을 반환
예) SELECT Getutcdate()

2009. 6. 30. 17:55

[Oracle] DML 절에 With Check option 조건

DML절에 With Check option절을 주어 View에서 생성된 조건에 대한 값을 반환과

동시에 DML에서 check 제약조건을 걸수 있다.
 

ex_) 

INSERT INTO  (  SELECT employee_id, last_name, email, hire_date, job_id, salary

                                FROM    empl3

                                WHERE  department_id = 50

                                WITH CHECK OPTION)

Values (9999, 'kkm', 'kyungmo', sysdate, 'kim', 5000);

 

View안에 where절을 보면 departmen_id값이 50인 값만을 반환한다. 동시에

department_id값에 check 제약조건을 50으로 걸어둔 것이다 .

 

지금 예문은

ORA-01402 : view WITH CHECK OPTION where-clauses violation

이렇게 에러가난다. 이유는 위에 설명과 같다.

insert되는 department값이 50값만 들어갈수 있는데. department_id 컬럼에 대한 명시는

insert절에 되어 있지 않다. 그래서 check 제약조건에 걸린다.

 

이걸 맞는 구문으로 바꾼다면 

INSERT INTO  (  SELECT employee_id, last_name, email, hire_date, job_id, 

                                               salary,  department_id

                                FROM    empl3

                                WHERE  department_id = 50

                                WITH CHECK OPTION)

Values (9999, 'kkm', 'kyungmo', sysdate, 'kim', 5000, 50);

이렇게 바꿔주면 check 제약조건에 걸리지 않는 쿼리가 된다.

2009. 4. 15. 14:59

[Oracle] 오라클 객체(4) [SYNONYM]

- SYNONYM은 오라클 객체(테이블, 뷰, 시퀀스, 프로시저)에 대한 대체이름(Alias)를 말합니다.

 

- Synonym은 실질적으로 그 자체가 Object가 아니라 Object에 대한 직접적인 참조 입니다.

 

- Synonym을 사용하는 이유는...

1) 데이터베이스의 투명성을 제공하기 위해서 사용 한다고 생각하면 됩니다.

    Synonym은 다른 유저의 객체를 참조할 때 많이 사용을 합니다.

 

2) 만약에 실무에서 다른 유저의 객체를 참조할 경우가 있을때 Synonym을 생성해서 사용을 하면은 추후에 참조하고 있는 오브젝트가 이름을 바꾸거나 이동할 경우 객체를 사용하는 SQL문을 모두 다시 고치는 것이 아니라 Synonym만 다시 정의하면 되기 때문에 매우 편리 합니다.

 

3) 객체의 긴 이름을 사용하기 편한 짧은 이름으로 해서 SQL코딩을 단순화 시킬 수 있습니다.

 

4) 또한 객체를 참조하는 사용자의 오브젝트를 감출 수 있기 때문에 이에 대한 보안을 유지할 수 있습니다. Synonym을 사용하는 유저는 참조하고 있는 객체에 대한 사용자의 오브젝트의 소유자, 이름, 서버이름을 모르고 Synonym 이름만 알아도 사용할 수 있습니다.

 

                                                                                                                                      

** Synonyms를 사용하는 경우 **

 

- 오브젝트의 실제 이름과 소유자 그리고 위치를 감춤으로써 database 보안을 개선하는데 사용 됩니다.

- object에의 Public Access를 제공 합니다.

- Remote Database의 Table, View, Program Init를 위해 투명성을 제공 합니다.

- Database 사용자를 위해 SQL문을 단순화 할 수 있습니다.

 

Synonym에는 두가지 종류가 있습니다.

1) Private Synonym

 - 전용 Synonym은 특정 사용자만 이용할 수 있습니다.

 

2) Public Synonym

 - 공용 Synonym은 고용 사용자 그룹이며 소유하며 그 Database에 있는 모든 사용자가 공유

 

                                                                                                                                      

** Synonym 생성 문법 **

**[ Syntax ]*************************************************

* CREATE [PUBLIC] SYNONYM synonym_name

* FOR object_name

*************************************************************

 

- Public : 모든 사용자가 접근 가능한 시노님을 생성 합니다.

              Public Synonym의 생성 및 삭제는 DBA만이 할 수 있습니다.

 

                                                                                                                                      

※ scott USER의 emp테이블을 test USER가 사용하는 예제

 

1. 먼저 scott/tiger USER로 접속해서 test USER에게 emp테이블을 조작할 권한을 부여합니다.

 

SQL> GRANT ALL ON emp TO test;

         권한이 부여되었습니다.

 

test user에 대하여 scott의 emp테이블을 조작할 수 있는 권한을 부여 합니다.

권한이 있어야 select하거나 update, insert할 수 있습니다.

 

2. test USER로 접속해 동의어를 생성합니다.

 

SQL> connect test/test

 

SQL> CREATE SYNONYM scott_emp FOR scott.emp;

시노님이 생성되었습니다.

 

scott USER가 소유하고 있는 emp테이블에 대해 scott_emp라는 일반시노님을 생성 했습니다.

scott 사용자의 emp테이블을 test사용자가 scott_emp라는 동의어로 사용 합니다.

 

-- 시노님을 이용한 쿼리

SQL> SELECT empno, ename FROM scott_emp;

 

-- 일반 테이블을 쿼리

SQL> SELECT empno, ename FROM scott.emp;

이 두쿼리의 결과는 같습니다.

 

   EMPNO ENAME
-------- ---------
    7369 SMITH
    7499 ALLEN
    7521 WARD
    7566 JONES
    7654 MARTIN
    7698 BLAKE
          15 개의 행이 선택되었습니다.

                                                                                                                                      

** 동의어 삭제 **

 

SQL> DROP SYNONYM scott_emp;

시노님이 삭제 되었습니다.

 

SQL> SELECT empno, ename FROM scott_emp;

라인 1에 오류:

ORA - 00942 : 테이블 또는 뷰가 존재하지 않습니다.

 

                                                                                                                                      

 

 

 
  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================
※ 강좌를 다른 홈페이지에 기재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

2009. 4. 15. 14:58

[Oracle] 오라클 객체(3) [SEQUENCE(시퀀스)]

** 시퀀스란? **

- 유일(UNIQUE)한 값을 생성해주는 오라클 객체 입니다.

- 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성할 수 있습니다.

- 보통 primary key 값을 생성하기 위해 사용합니다.

- 메모리에 Cache되었을 때 Swquence값의 엑세스 효율이 증가 합니다.

- Sequence는 테이블과는 독립적으로 저장되고 생성됩니다. 따라서 하나의 sequence를 여러 테이블에서 쓸 수 있습니다.

 

                                                                                                                                       

** 시퀀스 생성 **

**[ Syntax ] **************************************

* CREATE SEQUENCE sequence_name

*  [ START WITH n ]

*  [ INCREMENT BY n ]

[ MAXVALUE n | NOMAXVALUE ]

*  [ MINVALUE n | NOMINVALUE ]

*  [ CYCLE | NOCYCLE ]

**************************************************

 

- START WITH : 시퀀스의 시작 값을 지정 합니다. n을 1로 지정하면 1부터 순차적으로 시퀀스 번호가 증가 합니다.

 

- INCREMENT BY : 시퀀스의 증가 값을 말합니다. n을 2로 하면 2씩 증가합니다. START WITH를 1로 하고 INCREMENT BY를 2로 하면 1,3,5,7... 이렇게 시퀀스 번호가 증가 됩니다.

 

- MAXVALUE n | NOMAXVALUE : MAXVALUE는 시퀀스가 증가할 수 있는 최대값을 말합니다.

                                                 NOMAXVALUE는 시퀀스의 값을 무한대로 지정합니다.

 

- MINVALUE n | NOMINVALUE : MINVALUE는 시퀀스의 최소값을 지정 합니다.

                                               기본 값은 1이며, NOMINVALUE를 지정할 경우 최소값은 무한

                                               대가 됩니다.

 

SQL> CREATE SEQUENCE emp_seq

          START WITH 1

          INCREMENT BY 1

          MAXVALUE 100000;

 

sequence create.

 

시작 값이 1이고 1씩 증가하고, 최대값이 100000만이 되는 시퀀스를 생성했습니다.

 

SQL> INSERT INTO emp(empno, ename, hiredate)

          VALUES(emp_seq, NEXTVAL, ' julia', sysdate);

 

empno는 컬럼값을 입력할 때 일일이 다음 값을 기억하지 않아도 NEXTVAL을 사용하여 자동으로 입력할 수 있습니다.

 

CURRVAL : 현재 값을 반환 합니다.

NEXTVAL : 현재 시퀀스값의 다음 값을 반환 합니다.

 

SQL> SELECT emp_seq.CURRVAL FROM DUAL;

 

        CURRVAL
        ---------
                  1

SQL> SELECT emp_seq.NEXTVAL FROM DUAL;

 

       NEXTVAL
     ---------
                 2

                                                                                                                                       

** 사용규칙 **

 

- NEXTVAL, CIRRVAL을 사용할 수 있는 경우

 - subquery가 아닌 select문

 - insert문의 selectㅁ\절

 - insert문의 value절

 - update문의 set절

 

- NEXTVAL, DURRVAL을 사용할 수 없는 경우

 - view의 select절

 - distinct 키워드가 있는 select문

 - group by, havinh, order by절이 있는 select문

 - select, delete, update의 Subquery

 - create table, alter table명령의 default값

 

                                                                                                                                       

** 시퀀스의 수정 및 삭제 **

 

**[ Syntax] ****************************************

* ALTER SEQUENCE sequence_name

*  [ INCREMENT BY n]

*  [ MAXVALUE n | NOMAXVALUE ]

*  [ MINVALUE n | NOMINVALUE ]

*  [ CYCLE | NOCYCLE ]

****************************************************

 

START WITH는 수정할 수 없습니다.

- START WITH절이 없다는 점을 빼고는 CREATE SEQUENCE와 같습니다.

 

SQL> ALTER SEQUENCE emp_seq

          INCREMENT BY 2

          CYCLE;

 

sequence altered.

 

2씩 증가하고, 최대값을 넘으면 다시 처음부터 순환하도록 수정하였습니다.

 

DROP문을 필요하지 않은 시퀀스는 삭제 할 수 있습니다.

 

SQL> DROP SEQUENCE PRD_SEQ;

 

sequence dropped.

 

                                                                                                                                       

 

 
  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================
※ 강좌를 다른 홈페이지에 기재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

2009. 4. 15. 14:56

[Oracle] 오라클 객체(2) [VIEW 테이블]

** 뷰란? **

 

- 뷰는 하나의 가상 테이블이라 생각 하시면 됩니다.

- 뷰는 실제 데이터가 저장 되는 것은 아니지만 뷰를 통해 데이터를 관리 할 수 있습니다.

- 뷰는 복잡한 query를 통해 얻을 수 있는 결과를 간단한 query를 써서 구할 수 있게 합니다.

- 한개의 뷰로 여러 테이블에 대한 데이터를 검색할 수 있습니다.

- 특정 평가기준에 따른 사용자 별로 다른 데이터를 액세스 할 수 있도록 합니다.

 

                                                                                                                                  

** 뷰의 제한 조건 **

 

- 테이블에 NOT NULL로 만든 컬럼들이. 뷰에 다 포함이 되 있어야 됩니다.

- 그리고 ROWID, ROWNUM, NEXTVAL, CURRVAL 등과 같은 가상컬럼에 대한 참조를 포함하고 있는 뷰에는 어떤 데이터도 Insert할 수 없습니다.

- WITH READ ONLY 옵션을 설정한 뷰도 데이터를 갱신할 수 없습니다.

- WITH CHECK OPTION을 설정한 뷰는 뷰의 조건에 해당되는 데이터만 삽입, 삭제, 수정을 할 수 있습니다.

 

                                                                                                                                  

**[ Syntax ]*******************************************************************

* CREATE[OR REPLACE] [FORCE|NOFORCE] VIEW view_name

* AS subquery

* [WITH CHECK OPTION [CONSTRAINT 제약조건]]

* [WITH READ ONLY]

*******************************************************************************

 

- FORCE : 기본 테이블 유무에 관계없이 VIEW를 생성

 

- WITH CHECK OPTION : VIEW에 의해 엑세스될 수 있는 행만이 입력되거나 변경될 수 있음을 지정 합니다.

 

- WITH READ ONLY : SELECT만 가능한 VIEW의 생성

 

- VIEW를 정의 하는 질의어에는 ORDER BY절을 사용할 수 없습니다.

 

- 함수를 사용한 컬럼은 반드시 ALIAS를 지정해야 합니다.

 

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

 

view created

 

이렇게 뷰를 생성해 놓고 뷰를 통해 검색을 하면 됩니다.

 

SQL> SELECT * FROM Name_Query;

 

ENAME                DNAME
-------------------- ----------
SMITH                RESEARCH
JONES                RESEARCH
SCOTT               RESEARCH
ADAMS               RESEARCH
FORD                 RESEARCH

 

                                                                                                                                  

** WITH CHECK OPTION **

 

view의 조건식을 만족하는 데이터만 INSERT 또는 UPDATE가 가능하도록 하는 옵션 입니다.

 

SQL> CREATE OR REPLACE VIEW Check_Option

          AS SELECT empno, ename, deptno

               FROM emp

               WHERE deptno = 10

          WITH CHECK OPTION

 

view create

 

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의 조건에 위배 됩니다
부서 번호가 10인 사원만 INSERT, UPDATE할 수 있습니다.

                                                                                                                                  

** 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

 

view created.

 

단순히 읽기만 할수 있고 데이터는 입력하지 못합니다.

 

                                                                                                                                  

** VIEW에 대한 DML문 사용 규칙 **

- VIEW가 다음 사항을 포함하는 경우 행의 삭제 불가

 -> JOIN조건, 그룹함수, GOUP BY절, DISTINCT명령

 

- VIEW가 다음 사항을 포함하는 경우 데이터 수정 불가

 -> JOIN조건, 그룹함수, GROUP BY절, DISTINCT명령, 식으로 정의된 컬럼(EX SAL * 0.1)

 

- VIEW가 다음 사항을 포함하는 경우 데이터 추가 불가

 -> JOIN조건, 그룹함수, GROUP BY절, DISTINCT명령, 식으로 정의된 컬럼, VIEW에 선택되지 않는 NOT NULL컬럼

 

                                                                                                                                  

** 뷰의 정보 조회 **

 

USER_VIEWS 데이터 사전을 통해서 뷰에 대한 정보를 조회 할 수 있습니다.

 

SQL> SELECT view_name, text

          FROM USER_VIEWS;

 

                                                                                                                                  

** 뷰의 삭제 **

 

SQL> DROP VIEW Read_Only;

 

view dropped.

 

                                                                                                                                  

  

 

  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================
※ 강좌를 다른 홈페이지에 기재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^