我目前有一些安装了多个扩展副本的数据库。具体来说,我希望仅从公共模式中删除tablefunc函数的多个副本。请考虑以下数据库结构:
extensions schema
functions
colpivot(...
crosstab(...
...
public schema
functions
colpivot(...
crosstab(...
...
如何从公共模式中删除所有tablefunc扩展函数?
在我的例子中,DROP EXTENSION tablefunc;
只是从扩展模式中删除了函数(与我想要实现的相反)。当然,这是通过多个数据库和EXTENSIONS扩散的,所以我想要一个脚本来定位扩展名,而不是硬编码所有各种DROP FUNCTION...
命令。
答案 0 :(得分:1)
实际上不是答案,但这里是你可以开始的地方:
with obj_list as (
select
case when p.oid is not null then 'p' when t.oid is not null then 't' end as tp,
case when p.oid is not null then p.oid::regprocedure::text when t.oid is not null then t.typname end as def,
d.objid
from pg_depend d left join pg_proc p on (d.objid = p.oid) left join pg_type t on (d.objid = t.oid)
where refobjid = (select oid from pg_extension where extname = 'tablefunc' /* extension name here */ ))
select
case tp when 't' then 'drop type ' when 'p' then 'drop function ' end || 'public.' || def || ';' as drop_stmt
from obj_list
order by objid desc /* reverse object creation order to saticfy dependencies */;
输出:
┌──────────────────────────────────────────────────────────────────────────────┐
│ drop_stmt │
╞══════════════════════════════════════════════════════════════════════════════╡
│ drop function public.connectby(text,text,text,text,text,integer); │
│ drop function public.connectby(text,text,text,text,text,integer,text); │
│ drop function public.connectby(text,text,text,text,integer); │
│ drop function public.connectby(text,text,text,text,integer,text); │
│ drop function public.crosstab(text,text); │
│ drop function public.crosstab(text,integer); │
│ drop function public.crosstab4(text); │
│ drop function public.crosstab3(text); │
│ drop function public.crosstab2(text); │
│ drop type public.tablefunc_crosstab_4; │
│ drop type public.tablefunc_crosstab_3; │
│ drop type public.tablefunc_crosstab_2; │
│ drop function public.crosstab(text); │
│ drop function public.normal_rand(integer,double precision,double precision); │
└──────────────────────────────────────────────────────────────────────────────┘