sql >> Database >  >> RDS >> PostgreSQL

Hoe te vinden waar de functie wordt gebruikt

Ervan uitgaande dat u weet dat het een triggerfunctie is (d.w.z. RETURNS TRIGGER ), zou dit het moeten doen:

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

Als func1 overbelast is, zou u b.v. tgfoid = 'func1(text,text)'::regprocedure .

Maar over het algemeen kan het ook voorkomen in pg_aggregate , of pg_cast , of in een weergavedefinitie, of een controlebeperking, of een tiental andere plaatsen, en je wilt ze niet allemaal moeten controleren.

U kunt dit tot op de bodem uitzoeken via pg_depend , die alle objectafhankelijkheden in de database bijhoudt. Bijvoorbeeld:

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

Als dit b.v. pg_attrdef , dan weet je dat het wordt gebruikt in een standaardkolom. De andere velden in pg_depend zal u precies vertellen welke tabel/kolom het is. Merk op dat een aanroep van een andere functie niet als een afhankelijkheid wordt beschouwd, dus u moet nog steeds pg_proc.prosrc controleren .

Maar er is een eenvoudigere manier om de meeste afhankelijkheden op te sporen:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Als func1 wordt gebruikt, de DROP zal (waarschijnlijk) mislukken, en de fout zal u precies vertellen waar.

Nog makkelijker, als je een shell bij de hand hebt:gewoon om pg_dump --schema-only uit te voeren en kijk waar func1 verschijnt.



  1. Hoe de huidige tijd in MySQL in te voegen met Java

  2. SQL Server:geef kolomnamen terug op basis van de waarde van een record

  3. Omgekeerde coördinaten in PostgreSQL-polygoonkolom

  4. Postgres-gebruiker bestaat niet?