PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como encontrar onde a função está sendo usada


Supondo que você saiba que é uma função de gatilho (ou seja, RETURNS TRIGGER ), Isso deve servir:
SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc

Se func1 está sobrecarregado, você precisaria usar, por exemplo, tgfoid = 'func1(text,text)'::regprocedure .

Mas, em geral, também pode aparecer em pg_aggregate , ou pg_cast , ou em uma definição de exibição, ou uma restrição de verificação, ou uma dúzia de outros lugares, e você não quer ter que verificar todos eles.

Você pode chegar ao fundo disso em pg_depend , que rastreia todas as dependências de objetos no banco de dados. Por exemplo:
SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc

Se isso retornar, por exemplo pg_attrdef , então você sabe que é usado em um padrão de coluna. Os outros campos em pg_depend irá dizer-lhe exatamente qual é a tabela/coluna. Observe que uma chamada de outra função não é considerada uma dependência, portanto, você ainda precisa verificar pg_proc.prosrc .

Mas há uma maneira mais simples de rastrear a maioria das dependências:
BEGIN;
DROP FUNCTION func1();
ROLLBACK;

Se func1 está sendo usado, o DROP irá (provavelmente) falhar, e o erro lhe dirá exatamente onde.

Ainda mais fácil, se você tiver um shell à mão:apenas para executar pg_dump --schema-only e veja onde func1 aparece.