PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

3 Cara Mendaftar Semua Prosedur Tersimpan yang Mereferensikan Tabel di PostgreSQL

Berikut adalah tiga contoh mengembalikan daftar prosedur tersimpan yang mereferensikan tabel tertentu di PostgreSQL.

information_schema.routines Lihat

Kami dapat menanyakan information_schema.routines lihat untuk melihat apakah ada definisi yang berisi nama tabel.

Contoh:

SELECT
    routine_name,
    routine_body,
    routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';

Dalam contoh ini, saya memeriksa untuk melihat apakah ada prosedur tersimpan yang memiliki teks artists dalam definisi mereka.

ILIKE operator membuat kecocokan tidak peka huruf besar/kecil menurut lokal aktif. Ini adalah ekstensi PostgreSQL, dan ini bukan bagian dari standar SQL. Untuk pencocokan peka huruf besar/kecil, gunakan LIKE .

Perhatikan bahwa itu tidak sempurna, dalam arti bahwa itu bisa mengembalikan positif palsu jika teks ada dalam prosedur, tetapi itu bukan tabel. Untuk mengurangi risiko ini, Anda mungkin dapat memperbaiki kriteria filter.

pg_proc Katalog

pg_catalog.pg_proc katalog menyimpan informasi tentang fungsi, prosedur, fungsi agregat, dan fungsi jendela. Oleh karena itu, kita dapat menanyakan seperti ini:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

Dalam hal ini, kami menggabungkan katalog dengan pg_catalog.pg_namespace katalog untuk memfilter hasil ke hanya prosedur dengan public ruang nama.

Sebagai alternatif, kita dapat menggunakan pg_get_functiondef() berfungsi untuk mendapatkan definisi. Fungsi ini sebenarnya merekonstruksi perintah pembuatan untuk prosedur tersimpan. Ini adalah rekonstruksi yang didekompilasi, bukan teks asli dari perintah. Ini menghasilkan CREATE OR REPLACE PROCEDURE pernyataan untuk prosedur tersimpan.

Contoh:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

Dapatkan Baris Spesifik yang Merujuk Tabel

Kami dapat memodifikasi kueri kami untuk menyertakan nomor baris yang merujuk ke tabel:

SELECT *
FROM (
    SELECT 
        proname AS stored_procedure, 
        row_number() OVER (partition by proname) AS line_number, 
        textline
    FROM (
        SELECT 
            proname, 
            unnest(string_to_array(prosrc, chr(10))) AS textline
        FROM pg_proc p
        JOIN pg_namespace n ON n.oid = p.pronamespace
        WHERE nspname = 'public'
        AND prosrc ILIKE '%artists%'
        ) lines
    ) x
WHERE textline ILIKE '%artists%';

Contoh ini didasarkan pada jawaban Stack Overflow oleh Klin.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi Jendela:last_value(ORDER BY ... ASC) sama dengan last_value(ORDER BY ... DESC)

  2. Perintah COPY Postgresql memberikan Izin ditolak kesalahan

  3. Menghitung jumlah kemunculan substring dalam string di PostgreSQL

  4. Antarmuka visual PostgreSQL mirip dengan phpMyAdmin?

  5. Bagaimana cara memeriksa apakah pemicu ada di PostgreSQL?