sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo encontrar dónde se está utilizando la función

Suponiendo que sepa que es una función de activación (es decir, RETURNS TRIGGER ), esto debería hacerlo:

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

Si func1 está sobrecargado, necesitaría usar p. tgfoid = 'func1(text,text)'::regprocedure .

Pero, en general, también puede aparecer en pg_aggregate o pg_cast , o en una definición de vista, o en una restricción de verificación, o en una docena de otros lugares, y no desea tener que verificarlos todos.

Puede llegar al fondo de esto a través de pg_depend , que rastrea todas las dependencias de objetos en la base de datos. Por ejemplo:

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

Si esto vuelve, p. pg_attrdef , entonces sabe que se usa en una columna predeterminada. Los otros campos en pg_depend le dirá exactamente qué tabla/columna es. Tenga en cuenta que una llamada desde otra función no se considera una dependencia, por lo que aún debe verificar pg_proc.prosrc .

Pero hay una forma más sencilla de rastrear la mayoría de las dependencias:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Si func1 se está utilizando, el DROP (probablemente) fallará, y el error le dirá exactamente dónde.

Aún más fácil, si tiene un shell a mano:solo para ejecutar pg_dump --schema-only y ver donde func1 aparece.