반응형
  • UNION

목적: 두 개 이상의 테이블에 저장된 데이터의 한 결과셋을 다른 결과셋 위에 포갠다.

조건: 해당열의 데이터 유형 동일

특징: 중복을 제거하는 정렬작업 밟생 가능성이 있다.

        즉, UNION 을 사용하는 것은 UNION ALL 의 출력에 DISTINCT 를 적용하는 것과 거의 같다. 

*TIP: 필수가 아니라면, 쿼리에서 DISTINCT 를 사용하지 않는다. 

 

 

  • UNION ALL 

목적: 여러 행 소스의 행들을 하나의 결과셋으로 결합

특징: 중복 포함

반응형
반응형

-- === migration_user 권한 신청 목록 ===

 

GRANT SELECT ANY DICTIONARY TO migration_user;

GRANT SELECT ANY TABLE TO migration_user;

GRANT SELECT ANY SEQUENCE TO migration_user;

GRANT EXECUTE ANY PROCEDURE TO migration_user;

GRANT EXECUTE ON DBMS_METADATA TO migration_user;

반응형
반응형
  정리가 잘 되어 있는 블로그들
vscode vs git 연동 https://velog.io/@ahnsanghyeon/VSCode%EC%97%90%EC%84%9C-Git-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
  https://parksb.github.io/article/28.html
   
   
   
   
   
   
반응형
반응형
     
  데이터 사일로(data silo) 부서/사업/솔루션별로 데이터가 고립되어 전사 관점의
의사결정을 방해하고, 비효율성이 증가하는 현상
     
     
     
     
     
반응형
반응형

Oracle 의 NUMBER 타입

선언 방법 : NUMBER(p, s)

 

-- NUMBER(5, 2) : 전체 5자리, 소수점 2자리 -- 정수부 최대 3자리 (5-2=3)

INSERT 값 저장 값 123.456123.46 (소수점 3째자리 반올림)

 

-- 실무 예시 salary NUMBER(10, 2) -- 최대 9999999.99 price NUMBER(15, 4) -- 단가 (소수 4자리) quantity NUMBER(7) -- 정수 수량 rate NUMBER(5, 4) -- 이율 (0.1234)

 

선언                       저장 가능 예시                불가 예시

NUMBER(5,2)      123.45                           1234.5 (정수부 초과)

NUMBER(5,-2)     12300 (반올림)               9999999 (유효자리 초과)

NUMBER(3,5)       0.00123                         0.1 (유효자리 초과)

 

Oracle NUMBER → PostgreSQL 타입 변환

기본 매핑 테이블

OraclePostgreSQL설명
NUMBER NUMERIC 기본 대응 타입
NUMBER(P) NUMERIC(P) 정수형
NUMBER(P,S) NUMERIC(P,S) 소수점 포함
NUMBER(P,0) NUMERIC(P) 또는 INTEGER 정수

 

일반적인 ora2pg.conf 설정예시

DATA_TYPE NUMBER:numeric,\ NUMBER(1):smallint,\ NUMBER(2):smallint,\ NUMBER(3):smallint,\ NUMBER(4):smallint,\ NUMBER(5):integer,\ NUMBER(6):integer,\ NUMBER(7):integer,\ NUMBER(8):integer,\ NUMBER(9):integer,\ NUMBER(10):bigint,\ NUMBER(11):bigint,\ NUMBER(12):bigint,\ NUMBER(18):bigint,\ NUMBER(38):numeric

 

oracle to PostgreSQL 로 data migration 시 data type 변환에 관한 일반적인 설정

 

ORACLE   POSTGRESQL  
NUMBER[1-5, 3-10] 55555, 1111111111  (정수부분, 소수부분) NUMERIC 라 함은  실제로는 정수 5자리, 소수부분 39자리를 설정하고 싶다 하면
5+39 = 44
표현: numeric(44, 39) 
(전체자리수, 소수자리 부분)
정수부분 자리수: 44-39 = 5 자리임

       
       
반응형
반응형

PostgreSQL 에서 확인 SQL)

     sql) show default_transaction_read_only 

조회하면, 값이 'on' 으로 조회됨.

 

이것을 alter 등으로 바꿔야 하나..바뀌지 않음

 

원인 :

디스크 용량?

추가로 생성이 안되는 문제임...

vm 내렸다 올림.

 

2026.03.12

반응형
반응형

 

PostgreSQL

타겟 DB 초기 상태 확인 쿼리

data_clean  |  이관 전 클린 상태 점검

 

문서명 PostgreSQL 타겟 DB 초기 상태 확인 쿼리 모음
파일명 data_clean.docx
작성일 2026. 03. 12
버전 v1.0
용도 Oracle → PostgreSQL 이관 전 타겟 DB 클린 상태 검증

 

 

 

1. 개요

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,
       relname  AS 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');

 

구분 클린 상태 기대 결과 (건수)
스키마 0
테이블 0
인덱스 0
0
프로시저/함수 0
시퀀스 0
트리거 0
제약조건(FK/PK) 0

 

반응형
반응형
sql
-- 현재 사용자 소유의 테이블
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; 입니다. 필요한 정보에 따라 적절한 쿼리를 선택하시면 됩니다.

 
 
 
 
 
 
 

 

 
 
 
 
Sonnet 4.5
 
 
반응형

+ Recent posts