[PostgreSQL]프로시저 또는 함수내에서 특정 컬럼이나 문자열 찾는 쿼리
다음은 PostgreSQL에서 저장 프로시저(Procedure)나 함수(Function)의 소스 코드 내부에서 특정 컬럼명이나 문자열이 포함된 대상을 찾고 싶을 때 사용할 수 있는 쿼리입니다.
PostgreSQL의 시스템 카탈로그인 pg_proc과 pg_description(주석 찾기용)을 활용하여 조회할 수 있습니다. 상황에 맞는 쿼리를 복사해서 DBeaver에서 실행해 보세요.
1. 가장 기본적이고 확실한 방법 (소스 코드 내용 검색)
함수나 프로시저의 내부 본문(prosrc) 전체를 대상으로 지정한 문자열이 포함되어 있는지 검색합니다
SELECT n.nspname as schema_name
, p.proname as function_name
, pg_get_function_arguments(p.oid) as arguments
, CASE
WHEN p.prokind = 'f' THEN 'Function'
WHEN p.prokind = 'p' THEN 'Procedure'
ELSE 'Other'
END as type
, p.prosrc as source_code
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') -- 시스템 스키마 제외
AND p.prosrc ILIKE '%찾을_문자열_또는_컬럼명%' -- ILIKE는 대소문자 구분 없음
ORDER BY schema_name, function_name;
🔍 활용 팁: ILIKE를 사용했기 때문에 대소문자를 구분하지 않고 찾습니다. 만약 정확히 대소문자까지 일치하는 것만 찾으려면 LIKE로 바꾸시면 됩니다.
2. 함수 이름이나 반환 타입, 주석까지 한 번에 찾기
코드 본문뿐만 아니라, 함수 이름 자체나 함수에 달린 주석(Comment)에 해당 단어가 들어있는 경우까지 놓치지 않고 찾고 싶을 때 사용합니다.
SELECT n.nspname as schema_name
, p.proname as function_name
, d.description as function_comment
, p.prosrc as source_code
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
LEFT JOIN pg_description d ON p.oid = d.objoid
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
AND (
p.prosrc ILIKE '%찾을_문자열%' -- 소스 코드 내에서 검색
OR p.proname ILIKE '%찾을_문자열%' -- 함수/프로시저 이름에서 검색
OR d.description ILIKE '%찾을_문자열%' -- 코멘트(주석)에서 검색
)
ORDER BY schema_name, function_name;
💡 DBeaver 자체 UI 기능으로 찾는 방법 (쿼리 안 쓰고 찾기)
쿼리를 복사하기 번거롭다면 DBeaver가 제공하는 전역 검색 기능을 쓰셔도 편리합니다.
- DBeaver 상단 메뉴에서 [데이터베이스] (Database) ➡️ [검색] (Search)을 클릭합니다. (단축키:
Ctrl + H) - 상단 탭 중 [DB 메타데이터] 또는 [Database Objects] 탭을 선택합니다.
Object types목록에서Function과Procedure에 체크합니다.Search 주소/이름칸에 찾고 싶은 컬럼명이나 문자열을 입력하고 우측 하단 [검색]을 누릅니다.
3. 모든 DB 객체 내 문자열 통합 검색 쿼리
PostgreSQL에서 특정 컬럼명이나 문자열이 포함된
함수/프로시저뿐만 아니라 일반 뷰(View)와 트리거(Trigger)까지 데이터베이스 전체에서 한 번에 싹 긁어모아 조회할 수 있는 통합 쿼리입니다. 이 쿼리는 UNION ALL을 사용해 각 객체별(함수/프로시저, 일반 뷰, 트리거)로 대상 문자열이 걸리는 것들을 한 번에 모아서 보여줍니다.
WITH search_keyword AS (
-- 💡 이곳에 찾고자 하는 컬럼명이나 문자열을 입력하세요 (대소문자 구분 없음)
SELECT '찾을_문자열_또는_컬럼명'::text AS keyword
)
-- 1. 함수(Function) 및 저장 프로시저(Procedure) 검색
SELECT n.nspname AS schema_name
, p.proname AS object_name
, CASE
WHEN p.prokind = 'f' THEN 'Function (함수)'
WHEN p.prokind = 'p' THEN 'Procedure (프로시저)'
ELSE 'Routine'
END AS object_type
, p.prosrc AS object_definition
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
CROSS JOIN search_keyword sk
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
AND p.prosrc ILIKE '%' || sk.keyword || '%'
UNION ALL
-- 2. 일반 뷰(View) 및 구체화된 뷰(Materialized View) 검색
SELECT v.schemaname AS schema_name
, v.viewname AS object_name
, 'View (뷰)' AS object_type
, v.definition AS object_definition
FROM pg_views v
CROSS JOIN search_keyword sk
WHERE v.schemaname NOT IN ('pg_catalog', 'information_schema')
AND v.definition ILIKE '%' || sk.keyword || '%'
UNION ALL
-- 3. 트리거(Trigger) 소스 정의 검색
SELECT n.nspname AS schema_name
, t.tgname AS object_name
, 'Trigger (트리거) [테이블: ' || c.relname || ']' AS object_type
, pg_get_triggerdef(t.oid) AS object_definition
FROM pg_trigger t
JOIN pg_class c ON t.tgrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
CROSS JOIN search_keyword sk
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
AND t.tgisinternal = false -- 시스템이 내부적으로 자동 생성한 트리거 제외
AND pg_get_triggerdef(t.oid) ILIKE '%' || sk.keyword || '%'
ORDER BY object_type, schema_name, object_name;
각 파트별 조회 특징 설명
- 함수/프로시저 파트: 내부 소스 코드인
prosrc본문을 샅샅이 뒤져 찾아냅니다. - 뷰(View) 파트: 뷰가 만들어질 때 정의된
SELECT문 소스 텍스트(definition) 안에서 해당 단어를 매칭합니다. - 트리거(Trigger) 파트:
pg_get_triggerdef(t.oid)함수를 사용해 트리거의 실제 소스 정의문(예:CREATE TRIGGER... AFTER INSERT ON...)을 텍스트로 복원한 뒤 내부 문자를 검사합니다. 어떤 테이블에 걸려있는 트리거인지 직관적으로 알 수 있도록 타입란에 테이블명을 붙여 표기되도록 설계했습니다.




