Bir işlevin gövdesi yalnızca dize olarak saklanır . Referans verilen nesnelerin listesi yoktur. (Bu, örneğin referans verilen tablolara gerçek bağlantıların kaydedildiği görünümlerden farklıdır.)
Postgres 10 veya daha eski için bu sorgu , komut dosyasını ilgili işlevler için yeniden yapılandırmak üzere sistem kataloğu bilgi işlevinipg_get_functiondef()
kullanır ve büyük /CREATE FUNCTION
küçük harfe duyarlı olmayan normal ifadeyle tablo adını arar:
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';
İşi yapmalı, ama tabii ki kurşun geçirmez değil. Tablo adının dinamik olarak oluşturulduğu dinamik SQL için başarısız olabilir ve özellikle tablo adı ortak bir sözcükse, herhangi bir sayıda yanlış pozitif döndürebilir.
Toplama işlevleri ve sistem şemalarındaki tüm işlevler hariç tutulur.
\m
ve\M
normal ifadede bir kelimenin başlangıcını ve sonunu işaretleyin.
Sistem katalog pg_proc
Postgres 11 değiştirilebilir proisagg
ile ikame edilmiştir prokind
, gerçek saklanan prosedürleri ilave edildi. Uyum sağlamanız gerekiyor. İlişkili:
EXECUTE
gibi ifadeler bulamaması açısından tamamen sağlam değil'mm_'||name_parameter
ve"my""table""
vaka katlama veya vaka katlama ile alıntılanan isimlerle doğru bir şekilde başa çıkmayacak , ancak çoğu insanın isteyeceği şeylerin çoğunu yapacak .