sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man hittar var funktionen används

Förutsatt att du vet att det är en triggerfunktion (dvs. RETURNS TRIGGER ), borde detta göra det:

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

Om func1 är överbelastad skulle du behöva använda t.ex. tgfoid = 'func1(text,text)'::regprocedure .

Men i allmänhet kan det också visas i pg_aggregate , eller pg_cast , eller i en vydefinition, eller en kontrollbegränsning, eller ett dussin andra platser, och du vill inte behöva kontrollera dem alla.

Du kan komma till botten med detta via pg_depend , som spårar alla objektberoenden i databasen. Till exempel:

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

Om detta returnerar t.ex. pg_attrdef , då vet du att den används i en kolumnstandard. De andra fälten i pg_depend kommer att berätta exakt vilken tabell/kolumn det är. Observera att ett anrop från en annan funktion inte anses vara ett beroende, så du måste fortfarande kontrollera pg_proc.prosrc .

Men det finns ett enklare sätt att spåra de flesta beroenden:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Om func1 används, DROP kommer (förmodligen) att misslyckas, och felet kommer att berätta exakt var.

Ännu enklare, om du har ett skal till hands:Bara för att köra pg_dump --schema-only och se var func1 dyker upp.



  1. hantera HTML-data i Oracle-fråga

  2. Hur skapar man lagrade procedurer i SQL?

  3. Formatmodeller som stöds för datumfunktionerna ROUND() och TRUNC() i Oracle

  4. Hur tar man bort kaskad när föräldra-ID och barn-ID finns på samma bord?