PostgreSQL: Belirli bir tabloya erişen tüm kayıtlı fonksiyonlar nasıl listelenir?


13

Giriş:

Eski, kullanılmayan vb.Dahil olmak üzere birkaç yüz saklanmış fonksiyona sahip PostgreSQL veritabanı.

Sorun

Tablo yapısını değiştirmek istediğiniz gibi - tablo X ile herhangi bir ilişkisi olan tüm depolanan işlevleri bulmak gerekir. Bazıları kullanılmayabilir, bu yüzden sadece kod bakarak bunu yapamam.

ATM var çözüm psql's \df+ve grepping çıkış çalışıyor, ama daha fazla veritabanı benzeri bir çözüm, yani bilgi şeması kullanarak tercih ederim. Bu kesinlikle tekrar eden bir görev olacak ve güzel ve temiz olmasını istiyorum.

Herhangi bir öneri?

Yanıtlar:


18

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.

\mve\M normal ifadede bir kelimenin başlangıcını ve sonunu işaretleyin.

Sistem katalog pg_procPostgres 11 değiştirilebilir proisaggile ikame edilmiştir prokind, gerçek saklanan prosedürleri ilave edildi. Uyum sağlamanız gerekiyor. İlişkili:


1
Evet ... bu EXECUTEgibi ifadeler bulamaması açısından tamamen sağlam değil 'mm_'||name_parameterve "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 .
Craig Ringer

@CraigRinger: Evet, dinamik sorguları ele almak EXECUTEneredeyse imkansız. Ancak büyük / küçük harf katlama, büyük ~*/ ~küçük harf duyarlı olmayan herhangi bir desen eşleştirme yerine - ile kaplanabilir .
Erwin Brandstetter

Operatör aslında adlandırılmış tablolar oluşturacak kadar çılgın olmadığı "MyTable"ve MyTableen azından ... ve dürüst olmak gerekirse, bu bir "iyi, buna izin verilebilir ama akıllı değildir" hareketi.
Craig Ringer

Cevap için teşekkürler! Aslında hiçbir yerde dinamik tablo adı inşaat kullanmıyorum ve tüm tablo adları küçük harf.
Sergey Kudriavtsev

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.