PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come trovare dove viene utilizzata la funzione

Supponendo che tu sappia che è una funzione di attivazione (ad esempio RETURNS TRIGGER ), questo dovrebbe farlo:

SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc

Se func1 è sovraccarico, dovresti usare ad es. tgfoid = 'func1(text,text)'::regprocedure .

Ma in generale, potrebbe anche apparire in pg_aggregate o pg_cast , o in una definizione di vista, o in un vincolo di controllo o in una dozzina di altri posti e non vuoi doverli controllare tutti.

Puoi andare fino in fondo tramite pg_depend , che tiene traccia di tutte le dipendenze degli oggetti nel database. Ad esempio:

SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc

Se questo ritorna ad es. pg_attrdef , allora sai che è usato in una colonna predefinita. Gli altri campi in pg_depend ti dirà esattamente quale tabella/colonna è. Nota che una chiamata da un'altra funzione non è considerata una dipendenza, quindi devi comunque controllare pg_proc.prosrc .

Ma c'è un modo più semplice per rintracciare la maggior parte delle dipendenze:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Se func1 viene utilizzato, il DROP (probabilmente) fallirà e l'errore ti dirà esattamente dove.

Ancora più semplice, se hai una shell a portata di mano:solo per eseguire pg_dump --schema-only e guarda dove func1 si presenta.