Forudsat at du ved, at det er en udløserfunktion (dvs. RETURNS TRIGGER
), burde dette gøre det:
SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc
Hvis func1
er overbelastet, skal du bruge f.eks. tgfoid = 'func1(text,text)'::regprocedure
.
Men generelt kan det også forekomme i pg_aggregate
eller pg_cast
, eller i en visningsdefinition, eller en kontrolbegrænsning eller et dusin andre steder, og du ønsker ikke at skulle tjekke dem alle sammen.
Du kan komme til bunden af dette via pg_depend
, som sporer alle objektafhængigheder i databasen. For eksempel:
SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc
Hvis dette returnerer f.eks. pg_attrdef
, så ved du, at det bruges i en kolonnestandard. De andre felter i pg_depend
vil fortælle dig præcis hvilken tabel/kolonne det er. Bemærk, at et opkald fra en anden funktion ikke anses for at være en afhængighed, så du skal stadig tjekke pg_proc.prosrc
.
Men der er en enklere måde at spore de fleste afhængigheder på:
BEGIN;
DROP FUNCTION func1();
ROLLBACK;
Hvis func1
bliver brugt, DROP
vil (sandsynligvis) mislykkes, og fejlen vil fortælle dig præcis hvor.
Endnu nemmere, hvis du har en skal ved hånden:Bare for at køre pg_dump --schema-only
og se hvor func1
dukker op.