Postgresql
PostgreSQL:如何列出訪問特定表的所有儲存函式
介紹:
具有數百個儲存功能的 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_proc
Postgres 11 中更改的系統目錄proisagg
被替換為prokind
,添加了真正的儲存過程。你需要適應。有關的: