엑시엄이 보는 DB 세상
오라클 DUAL TABLE의 이해 1 2 99,999+

by axiom DUAL DUAL 테이블 SYS.DUAL [2013.10.09]


이번 시간에는 오라클의 대표적인 Dummy 테이블인 DUAL TABLE에 대해 알아볼 것이다.

일반적으로 DUAL TABLE의 Owner는 SYS이지만 모든 사용자가 사용할 수 있다. 그리고 SELECT 문장에서 조회 시 오직 하나의 Row, 하나의 Column에 'X'만 출력된다.

DUAL TABLE은 Internal Views에 조인을 위한 목적으로 오라클의 Chuck Weiss에 의해 만들어졌다.

"DUAL 테이블을 오라클 데이터 딕셔너리에 Object로 만들었고, 뷰 내부에서 사용하기 위한 용도로 만들었다. DUAL이라는 이름에서 단지 하나로부터 한 쌍의 열을 만들어 내는 과정을 쉽게 볼 수 있다. 최초 2개의 열을 가지고 있었기 때문에 이름이 DUAL 테이블로 명명된 것이며 지금은 단지 하나의 데이터만 저장되게 되었다."

위 원작자의 설명은 DUAL 테이블의 제작 의도와 중요성에 대해 시사하는 바가 크다고 할 수 있다. 이 글에서는 DUAL 테이블에 대한 간단한 테스트를 통해 DUAL 테이블에 대해 좀 더 이해하는 시간을 가진다.

DML 테스트로 DUAL TABLE 조작

이 글의 내용을 테스트할 경우 반드시 개인 PC와 같은 영향도가 없는 시스템에서만 테스트하길 바란다.

DUAL 테이블의 속성을 좀 더 확인하기 위해 해당 테이블에 DML을 수행해 보자. 아래의 SQL을 수행하면서 DUAL TABLE의 속성을 이해할 수 있을 것이다.

CONN AS SYSDBA;

INSERT INTO DUAL VALUES('A');
INSERT INTO DUAL VALUES('B');

COMMIT;


SELECT * FROM DUAL;
D
-
X

위의 SQL을 통해 INSERT를 수행했지만 조회해 보면 INSERT된 값은 추출되지 않고 원래의 값인 'X'만 확인되었다.

결국, DUAL 테이블에 데이터를 INSERT해도 추가된 데이터를 확인할 수는 없었지만 테이블을 복제해서 저장된 데이터를 확인할 수 있다.

-- 결과 건수로 INSERT 성공을 알 수 있다.
SELECT COUNT(*) FROM DUAL;

COUNT(*)
--------
3 

-- SCOTT 사용자로 접속해서 조회해보자
CONNECT SCOTT/TIGER
SELECT * FROM DUAL;
D
-
X


-- 복제 테이블 생성
CREATE TABLE PPS_DUAL 
    AS 
SELECT * FROM DUAL;

-- 복제 테이블 조회
SELECT * FROM PPS_DUAL;
D
-
X
A
B


-- SYS 사용자 접속
CONNECT SYS AS SYSDBA

-- A, B 데이터 삭제
DELETE DUAL WHERE DUMMY = 'A';
DELETE DUAL WHERE DUMMY = 'B';
COMMIT;


SELECT COUNT(*) FROM DUAL;
COUNT(*)
--------
1

-- SCOTT 사용자로 접속해서 조회해보자
CONNECT SCOTT/SCOTT

-- DAUL 테이블 조회
SELECT COUNT(*) FROM DUAL;
COUNT(*)
--------
1

SELECT * FROM DUAL;
D
-
X

-- 복제 테이블 생성
CREATE TABLE PPS_DUAL 
    AS 
SELECT * FROM DUAL;

-- 복제 테이블 조회
SELECT * FROM PPS_DUAL;
D
-
X


SELECT COUNT(*) FROM PPS_DUAL;
COUNT(*)
--------
1

위의 테스트를 통해 실제 추출되는 데이터는'X'값에 불과하지만 사용자 권한에 따라 DUAL 테이블에 데이터를 추가/삭제 할 수 있다.

DDL 테스트로 DUAL TABLE 조작

이 글의 내용을 테스트할 경우 반드시 개인 PC와 같은 영향도가 없는 시스템에서만 테스트하길 바란다.

CONNECT /AS SYSDBA


CREATE TABLE SYS.DUAL
    ( DUMMY VARCHAR2(1) ) 
       TABLESPACE SYSTEM;
       
DROP PUBLIC SYNONYM DUAL;

CREATE PUBLIC SYNONYM DUAL FOR SYS.DUAL;

GRANT SELECT ON SYS.DUAL TO PUBLIC WITH GRANT OPTION;

INSERT INTO DUAL VALUES ('X');

COMMIT;

이제 DUAL TABLE를 DROP해 보자.

CONNECT /AS SYSDBA

DROP TABLE DUAL;

DUAL TABLE을 생성/삭제 가능함을 확인할 수 있다.

DUAL 테이블 역시 Object이므로 삭제 시 참조하는 관련 패키지, 프로시저, 함수, 뷰와 같은 Object에 직접적인 영향을 미친다.

DBMS_JOB, DBMS_STATS 등 확인할 수 있는 Object뿐 아니라 패치 및 오라클의 개별 제품 설치 등에서도 사용되므로 DUAL TABLE이 누군가에 의해 DROP되었다면 위와 같은 작업은 정상적으로 진행되지 못하고 ORACLE DB에 치명적인 장애가 발생할 수 있으므로 특별히 DUAL 테이블을 변경할 필요가 있다면 따로 테이블을 복사한 후 사용해야 마땅할 것이다.

참고자료

- 강좌 URL : http://www.gurubee.net/lecture/2637

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 아발란체 [2013.10.10 10:59:06]

오홍... DUAL도 철학이 있군요..
정의를 봤을 때는 보통 쓰던 방법이 그 목적인 것 같고요.
좋은 강좌 감사합니다.


by Oracler [2013.10.11 22:22:32]
DUAL 테이블에 대한 고찰 잘 보았습니다.
알고 있던 것보다 더 심오한 내용이 있군요.
공부가 많이 되었습니다. 고맙습니다.^^

참, Chuck Weiss의 글에서 '열'을 '행'으로 바꾸어 주셔야 합니다~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입