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

Sådan finder du, hvor funktionen bruges

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.



  1. ORA-00900:ugyldig SQL-sætningsfejl? Hvad er der galt med min sql?

  2. Hvordan kan jeg forhindre tilbagevendende automatiske forbindelser til Oracle-databasen?

  3. 2 måder at formatere dine forespørgselsresultater i SQLcl (Oracle)

  4. Latin-1 / UTF-8 kodning php