PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So finden Sie heraus, wo die Funktion verwendet wird

Angenommen, Sie wissen, dass es sich um eine Triggerfunktion handelt (z. B. RETURNS TRIGGER ), das sollte es tun:

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

Wenn func1 überlastet ist, müssten Sie z.B. tgfoid = 'func1(text,text)'::regprocedure .

Aber im Allgemeinen kann es auch in pg_aggregate erscheinen , oder pg_cast , oder in einer Ansichtsdefinition, einer Check-Einschränkung oder einem Dutzend anderer Stellen, und Sie möchten sie nicht alle überprüfen müssen.

Sie können dem über pg_depend , die alle Objektabhängigkeiten in der Datenbank verfolgt. Zum Beispiel:

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

Wenn dies z.B. pg_attrdef , dann wissen Sie, dass es in einem Spaltenstandard verwendet wird. Die anderen Felder in pg_depend wird Ihnen genau sagen, um welche Tabelle/Spalte es sich handelt. Beachten Sie, dass ein Aufruf von einer anderen Funktion nicht als Abhängigkeit betrachtet wird, daher müssen Sie trotzdem pg_proc.prosrc überprüfen .

Aber es gibt einen einfacheren Weg, die meisten Abhängigkeiten aufzuspüren:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Wenn func1 verwendet wird, der DROP wird (wahrscheinlich) fehlschlagen, und der Fehler wird Ihnen genau sagen, wo.

Noch einfacher, wenn Sie eine Shell zur Hand haben:Einfach pg_dump --schema-only ausführen und sehen Sie, wo func1 auftaucht.