PostgreSQL : 특정 테이블에 액세스하는 모든 저장된 함수를 나열하는 방법


13

소개:

더 이상 사용되지 않거나 사용되지 않는 등 수백 가지의 저장 기능이있는 PostgreSQL 데이터베이스

문제

테이블 구조를 변경하려면 테이블 X와 관계가있는 모든 저장된 함수를 찾아야합니다. 그들 중 일부는 사용되지 않을 수 있으므로 코드를 살펴보면 그렇게 할 수 없습니다.

ATM이있는 솔루션은 psql을 실행 \df+하고 grepping 출력을 수행하지만 정보 스키마를 사용하는 것과 같은 데이터베이스와 같은 솔루션을 선호합니다. 이것은 분명히 반복적 인 작업이 될 것이며 멋지고 깨끗하게하고 싶습니다.

어떤 제안?

답변:


18

함수의 본문은 문자열로 저장됩니다 . 참조 된 객체 목록이 없습니다. (예를 들어, 참조 된 테이블에 대한 실제 링크가 저장된 뷰와 다릅니다.)

Postgres 10 이전 버전에 대한이 쿼리 는 시스템 카탈로그 정보 기능pg_get_functiondef() 을 사용하여 CREATE FUNCTION관련 기능에 대한 스크립트 를 재구성하고 대소 문자를 구분하지 않는 정규식으로 테이블 이름을 검색합니다.

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  NOT p.proisagg
AND    n.nspname NOT LIKE 'pg_%'
AND    n.nspname <> 'information_schema'
AND    pg_get_functiondef(p.oid) ~* '\mbig\M';

그것은 일을해야하지만 분명히 방탄은 아닙니다. 테이블 이름이 동적으로 생성되는 동적 SQL의 경우 실패 할 수 있으며, 특히 테이블 이름이 공통 단어 인 경우 여러 개의 오 탐지를 리턴 할 수 있습니다.

시스템 스키마의 집계 함수 및 모든 함수는 제외됩니다.

\m하고\M 시작을 표시하고 정규 표현식에서 단어의 끝.

pg_procPostgres 11에서 변경된 시스템 카탈로그 proisagg가로 대체되었으며 prokind실제 저장 프로 시저가 추가되었습니다. 적응해야합니다. 관련 :


1
그렇습니다 ... EXECUTE와 같은 표현을 찾을 수 없다는 의미에서 완전히 강력 'mm_'||name_parameter하지는 않으며 인용 된 이름 "my""table""이나 대소 문자를 올바르게 처리 하지 못하지만 대부분의 사람들이 원하는 것을 대부분 수행합니다. .
Craig Ringer

@CraigRinger : 예, 동적 쿼리 EXECUTE는 다루기가 거의 불가능합니다. 그러나 케이스 폴딩으로 덮여 수 있습니다 ~*대신에 ~- 또는 다른 대소 문자를 구분 패턴 매칭.
Erwin Brandstetter 5

너무 오래 운영자가 미친 실제로라는 이름의 테이블을 생성하는 것만으로는 충분하지 않습니다로 "MyTable"하고 MyTableA의 정직 적어도 ... 그리고, "허용 될 수 물론이 있지만, 스마트 아니다"이동.
Craig Ringer

답변 해주셔서 감사합니다! 실제로 어디서나 동적 테이블 이름 구성을 사용하지 않으며 모든 테이블 이름은 소문자입니다.
Sergey Kudriavtsev

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.