PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

3 начина за изброяване на всички съхранени процедури, които препращат към таблица в PostgreSQL

Ето три примера за връщане на списък със съхранени процедури, които препращат към конкретна таблица в PostgreSQL.

information_schema.routines Преглед

Можем да потърсим information_schema.routines преглед, за да видите дали някоя от дефинициите съдържа името на таблицата.

Пример:

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

В този пример проверих дали някоя от съхранените процедури има текст artists в тяхното определение.

ILIKE операторът прави съвпадението нечувствително към регистъра на буквите според активния локал. Това е разширение на PostgreSQL и не е част от SQL стандарта. За съвпадение с отчитане на главни и малки букви използвайте LIKE .

Имайте предвид, че не е перфектен, в смисъл, че може да върне фалшиви положителни резултати, ако текстът е в процедурата, но не е таблица. За да смекчите този риск, може би бихте могли да прецизирате критериите за филтриране.

pg_proc Каталог

pg_catalog.pg_proc каталог съхранява информация за функции, процедури, агрегатни функции и функции на прозореца. Следователно можем да правим заявка по следния начин:

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%';

В този случай ние присъединяваме каталога с pg_catalog.pg_namespace каталог за филтриране на резултатите само до процедури с public пространство от имена.

Като алтернатива можем да използваме pg_get_functiondef() функция, за да получите дефиницията. Тази функция всъщност реконструира командата за създаване на съхранената процедура. Това е декомпилирана реконструкция, а не оригиналният текст на командата. Това води до CREATE OR REPLACE PROCEDURE изявление за съхранената процедура.

Пример:

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%';

Вземете конкретния ред, който препраща към таблицата

Можем да модифицираме нашата заявка, за да включим номера на реда, който препраща към таблицата:

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%';

Този пример се базира на отговор на препълване на стека от 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. PostgreSQL, преконфигурирайте съществуващата таблица, променяйки първичния ключ на type=serial

  2. Комбинирайте вложени заявки на цикъл към резултат от родителски масив - pg-promise

  3. Съхранявайте резултата от заявката в променлива, използвана в PL/pgSQL

  4. SQL актуализиране на полета на една таблица от полета на друга

  5. Проблем с възстановяването на базата данни Heroku