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.