이번 시간에는 오라클의 대표적인 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 테이블에 대해 좀 더 이해하는 시간을 가진다.
이 글의 내용을 테스트할 경우 반드시 개인 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 테이블에 데이터를 추가/삭제 할 수 있다.
이 글의 내용을 테스트할 경우 반드시 개인 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
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.