Oracle → PostgreSQL 데이터 이관을 시작하기 전, 타겟 PostgreSQL DB에 기존 오브젝트(스키마, 테이블, 데이터, 인덱스, 프로시저 등)가 없는 클린 상태임을 검증하는 SQL 쿼리 모음이다.
모든 항목의 COUNT가 0이면 이관을 시작할 수 있는 클린 상태이다.
구분
조회 대상 뷰/카탈로그
클린 상태 기준
스키마
information_schema.schemata
COUNT = 0
테이블
pg_tables
COUNT = 0
인덱스
pg_indexes
COUNT = 0
뷰
pg_views
COUNT = 0
프로시저/함수
pg_proc + pg_namespace
COUNT = 0
시퀀스
information_schema.sequences
COUNT = 0
트리거
information_schema.triggers
COUNT = 0
제약조건(FK/PK)
information_schema.table_constraints
COUNT = 0
2. 개별 확인 쿼리
■ 2.1 스키마 확인
pg_catalog, information_schema, pg_toast 등 시스템 스키마를 제외한 사용자 스키마를 조회한다.
-- 사용자 스키마 목록 조회 (시스템 스키마 제외) SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ( 'pg_catalog', 'information_schema', 'pg_toast' ) ORDER BY schema_name; -- 스키마 수만 빠르게 확인 SELECT COUNT(*) AS schema_count FROM information_schema.schemata WHERE schema_name NOT IN ( 'pg_catalog', 'information_schema', 'pg_toast' );
■ 2.2 테이블 확인
사용자 테이블 목록과 전체 테이블 수를 조회한다.
-- 사용자 테이블 전체 목록 SELECT schemaname, tablename, tableowner FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, tablename; -- 테이블 수만 확인 SELECT COUNT(*) AS table_count FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
■ 2.3 데이터 (행 수) 확인
pg_stat_user_tables를 이용하여 스키마별, 테이블별 실제 행 수를 확인한다.
-- 스키마별 전체 행 수 합계 SELECT schemaname, SUM(n_live_tup) AS total_rows FROM pg_stat_user_tables GROUP BY schemaname ORDER BY schemaname; -- 테이블별 행 수 상세 조회 SELECT schemaname, relnameAS tablename, n_live_tup AS row_count FROM pg_stat_user_tables ORDER BY schemaname, relname;
■ 2.4 인덱스 확인
사용자 스키마의 인덱스 목록과 수를 조회한다.
-- 사용자 인덱스 전체 목록 SELECT schemaname, tablename, indexname FROM pg_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, tablename, indexname; -- 인덱스 수만 확인 SELECT COUNT(*) AS index_count FROM pg_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
■ 2.5 프로시저 / 함수 확인
pg_proc과 pg_namespace를 조인하여 사용자 정의 프로시저 및 함수를 조회한다.
-- 프로시저 및 함수 목록 SELECT n.nspname AS schema_name, p.proname AS routine_name, CASE p.prokind WHEN 'f' THEN 'FUNCTION' WHEN 'p' THEN 'PROCEDURE' WHEN 'a' THEN 'AGGREGATE' END AS routine_type FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY schema_name, routine_name; -- 프로시저/함수 수만 확인 SELECT COUNT(*) AS routine_count FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname NOT IN ('pg_catalog', 'information_schema');
■ 2.6 뷰 확인
사용자 스키마의 뷰 목록과 수를 조회한다.
-- 뷰 전체 목록 SELECT schemaname, viewname, viewowner FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, viewname; -- 뷰 수만 확인 SELECT COUNT(*) AS view_count FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
■ 2.7 시퀀스 확인
사용자 스키마의 시퀀스 목록과 수를 조회한다.
-- 시퀀스 전체 목록 SELECT sequence_schema, sequence_name FROM information_schema.sequences WHERE sequence_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY sequence_schema, sequence_name; -- 시퀀스 수만 확인 SELECT COUNT(*) AS sequence_count FROM information_schema.sequences WHERE sequence_schema NOT IN ('pg_catalog', 'information_schema');
■ 2.8 트리거 확인
사용자 스키마의 트리거 목록을 조회한다.
-- 트리거 전체 목록 SELECT trigger_schema, trigger_name, event_object_table AS table_name, event_manipulation AS event FROM information_schema.triggers WHERE trigger_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY trigger_schema, trigger_name; -- 트리거 수만 확인 SELECT COUNT(*) AS trigger_count FROM information_schema.triggers WHERE trigger_schema NOT IN ('pg_catalog', 'information_schema');
■ 2.9 제약조건 (FK / PK) 확인
사용자 스키마의 PK, FK, UNIQUE 등 제약조건 현황을 조회한다.
-- 제약조건 전체 목록 SELECT constraint_schema, constraint_name, constraint_type, table_name FROM information_schema.table_constraints WHERE constraint_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY constraint_schema, constraint_type, table_name; -- 제약조건 수만 확인 SELECT COUNT(*) AS constraint_count FROM information_schema.table_constraints WHERE constraint_schema NOT IN ('pg_catalog', 'information_schema');
3. 전체 요약 한 번에 확인 (이관 전 클린 상태 점검)
아래 쿼리 하나로 전체 오브젝트 수를 한 번에 확인할 수 있다. 모든 항목이 0이면 이관을 시작할 수 있는 클린 상태이다.
SELECT '스키마'AS 구분, COUNT(*) AS 건수 FROM information_schema.schemata WHERE schema_name NOT IN ( 'pg_catalog', 'information_schema', 'pg_toast' ) UNION ALL SELECT '테이블', COUNT(*) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '인덱스', COUNT(*) FROM pg_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '뷰', COUNT(*) FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '프로시저/함수', COUNT(*) FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '시퀀스', COUNT(*) FROM information_schema.sequences WHERE sequence_schema NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '트리거', COUNT(*) FROM information_schema.triggers WHERE trigger_schema NOT IN ('pg_catalog', 'information_schema') UNION ALL SELECT '제약조건(FK/PK)', COUNT(*) FROM information_schema.table_constraints WHERE constraint_schema NOT IN ('pg_catalog', 'information_schema');
-- 현재 사용자 소유의 테이블
SELECT table_name
FROM user_tables
ORDER BY table_name;
-- 모든 사용자의 테이블 (권한 필요)
SELECT owner, table_name
FROM all_tables
ORDER BY owner, table_name;
-- DBA 권한으로 전체 테이블 조회
SELECT owner, table_name
FROM dba_tables
ORDER BY owner, table_name;
상세 정보 포함 조회
sql
-- 테이블 상세 정보
SELECT
table_name,
tablespace_name,
num_rows,
blocks,
avg_row_len,
last_analyzed
FROM user_tables
ORDER BY table_name;
-- 특정 스키마의 테이블
SELECT table_name
FROM all_tables
WHERE owner = 'YVETTE'
ORDER BY table_name;
테이블과 컬럼 정보 함께 조회
sql
-- 테이블별 컬럼 수
SELECT
table_name,
COUNT(*) AS column_count
FROM user_tab_columns
GROUP BY table_name
ORDER BY table_name;
-- 테이블과 주요 컬럼 정보
SELECT
t.table_name,
t.num_rows,
COUNT(c.column_name) AS column_count
FROM user_tables t
LEFT JOIN user_tab_columns c ON t.table_name = c.table_name
GROUP BY t.table_name, t.num_rows
ORDER BY t.table_name;
CSV 형식 출력
sql
-- CSV 형식으로 출력
SELECT LISTAGG(table_name, ',') WITHIN GROUP (ORDER BY table_name) AS table_list
FROM user_tables;
가장 많이 사용하는 건 SELECT table_name FROM user_tables ORDER BY table_name; 입니다. 필요한 정보에 따라 적절한 쿼리를 선택하시면 됩니다.