PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment trouver où la fonction est utilisée

En supposant que vous savez qu'il s'agit d'une fonction de déclenchement (c'est-à-dire RETURNS TRIGGER ), ceci devrait le faire :

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

Si func1 est surchargé, vous devrez utiliser par ex. tgfoid = 'func1(text,text)'::regprocedure .

Mais en général, il peut également apparaître dans pg_aggregate , ou pg_cast , ou dans une définition de vue, ou une contrainte de vérification, ou une douzaine d'autres endroits, et vous ne voulez pas avoir à les vérifier tous.

Vous pouvez aller au fond de cela via pg_depend , qui suit toutes les dépendances d'objets dans la base de données. Par exemple :

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

Si cela revient par ex. pg_attrdef , alors vous savez qu'il est utilisé dans une colonne par défaut. Les autres champs de pg_depend vous dira exactement de quelle table/colonne il s'agit. Notez qu'un appel d'une autre fonction n'est pas considéré comme une dépendance, vous devez donc toujours vérifier pg_proc.prosrc .

Mais il existe un moyen plus simple de retrouver la majorité des dépendances :

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Si func1 est utilisé, le DROP échouera (probablement), et l'erreur vous dira exactement où.

Encore plus simple, si vous avez un shell à portée de main :juste pour exécuter pg_dump --schema-only et voir où func1 apparaît.