Hier zijn drie voorbeelden van het retourneren van een lijst met opgeslagen procedures die verwijzen naar een specifieke tabel in PostgreSQL.
De information_schema.routines
Bekijk
We kunnen de information_schema.routines
. opvragen bekijken om te zien of een van de definities de tabelnaam bevat.
Voorbeeld:
SELECT
routine_name,
routine_body,
routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';
In dit voorbeeld heb ik gecontroleerd of een van de opgeslagen procedures de tekst artists
. had in hun definitie.
De ILIKE
operator maakt de overeenkomst hoofdletterongevoelig volgens de actieve landinstelling. Dit is een PostgreSQL-extensie en maakt geen deel uit van de SQL-standaard. Gebruik voor een hoofdlettergevoelige overeenkomst LIKE
.
Merk op dat het niet perfect is, in die zin dat het valse positieven kan retourneren als de tekst in de procedure staat, maar het is geen tabel. Om dit risico te verkleinen, kunt u misschien de filtercriteria verfijnen.
De pg_proc
Catalogus
De pg_catalog.pg_proc
catalogus slaat informatie op over functies, procedures, aggregatiefuncties en vensterfuncties. We kunnen daarom vragen als volgt:
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%';
In dit geval voegen we ons bij de catalogus met de pg_catalog.pg_namespace
catalogus om de resultaten te filteren naar alleen procedures met de public
naamruimte.
We kunnen ook de pg_get_functiondef()
. gebruiken functie om de definitie te krijgen. Deze functie reconstrueert in feite de opdracht voor het maken van de opgeslagen procedure. Het is een gedecompileerde reconstructie, niet de originele tekst van de opdracht. Dit resulteert in een CREATE OR REPLACE PROCEDURE
verklaring voor de opgeslagen procedure.
Voorbeeld:
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%';
De specifieke regel ophalen die naar de tabel verwijst
We kunnen onze query aanpassen om het regelnummer op te nemen dat naar de tabel verwijst:
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%';
Dit voorbeeld is gebaseerd op een Stack Overflow-antwoord van Klin.