Postgresql

PostgreSQL:如何列出訪問特定表的所有儲存函式

  • January 10, 2020

介紹:

具有數百個儲存功能的 PostgreSQL 數據庫,包括過時的、未使用的等。

問題

我需要找出與表 X 有任何關係的所有儲存函式——因為我想更改表結構。其中一些可能沒有使用,所以我不能僅僅通過查看程式碼來做到這一點。

我有 ATM 的解決方案是執行 psql\df+和 grepping 輸出,但我更喜歡類似數據庫的解決方案,即使用資訊模式。這肯定是一項重複性的任務,我希望它乾淨整潔。

有什麼建議?

函式的主體只是儲存為string。沒有引用對象的列表。(這與視圖不同,例如,其中保存了引用表的實際連結。)

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,添加了真正的儲存過程。你需要適應。有關的:

引用自:https://dba.stackexchange.com/questions/46995