메뉴 건너뛰기

test

추출

2025.03.05 11:23

관리자 조회 수:4

#!/bin/bash # 사용법: ./extract_view_tables.sh <데이터베이스명> <뷰명> # 예시: ./extract_view_tables.sh impala-host my_db my_view if [ $# -ne 3 ]; then echo "사용법: $0 <데이터베이스명> <뷰명>" exit 1 fi IMPALA_HOST="$1" DATABASE="$2" VIEW_NAME="$3" # 뷰 이름 유효성 검사 if ! echo "$VIEW_NAME" | grep -q '^[a-zA-Z0-9_]+$'; then echo "오류: 뷰 이름은 알파벳, 숫자, 밑줄(_)만 포함해야 합니다." exit 1 fi # Impala에서 VIEW의 DDL 가져오기 VIEW_DDL=$(impala-shell -i "$IMPALA_HOST" -B --quiet -q "SHOW CREATE VIEW ${DATABASE}.${VIEW_NAME};" 2>/tmp/impala_err.log) if [ $? -ne 0 ]; then echo "오류: 뷰 DDL을 가져오지 못했습니다. 이유: $(cat /tmp/impala_err.log)" rm -f /tmp/impala_err.log exit 1 fi rm -f /tmp/impala_err.log # SQL을 한 줄로 변환 SQL=$(echo "$VIEW_DDL" | tr '\n' ' ') # WITH 절 제거 SQL=$(echo "$SQL" | sed -E 's/WITH[[:space:]]+[^(]+[(][^)]+[)][[:space:]]*AS[[:space:]]+[(][^)]+[)]//gi') # FROM, JOIN, 쉼표 뒤 테이블명 추출 (컬럼명 제외) TABLES=$(echo "$SQL" | grep -o -E '(FROM|JOIN|,)[[:space:]]+[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?' | awk '{print $2}' | grep -v '[.]' | sort -u) # 서브쿼리 내 테이블 추출 (컬럼명 제외) SUBQUERY_TABLES=$(echo "$SQL" | grep -o -E '[(][^)]*FROM[[:space:]]+[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?' | grep -o -E '[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?' | grep -v '[.]' | sort -u) # 중복 제거 및 합치기 TABLES=$(echo -e "$TABLES\n$SUBQUERY_TABLES" | sort -u) # 결과 출력 if [ -z "$TABLES" ]; then echo "참조하는 물리 테이블이 없습니다." else echo "뷰 ${DATABASE}.${VIEW_NAME}가 참조하는 물리 테이블:" echo "$TABLES" | nl -w2 -s". " fi

위로