Postgresql - 从特定架构中删除扩展

时间:2017-11-24 19:45:23

标签: postgresql

我目前有一些安装了多个扩展副本的数据库。具体来说,我希望仅从公共模式中删除tablefunc函数的多个副本。请考虑以下数据库结构:

extensions schema
  functions
    colpivot(...
    crosstab(...
    ...
public schema
  functions
    colpivot(...
    crosstab(...
    ...

如何从公共模式中删除所有tablefunc扩展函数?
在我的例子中,DROP EXTENSION tablefunc;只是从扩展模式中删除了函数(与我想要实现的相反)。当然,这是通过多个数据库和EXTENSIONS扩散的,所以我想要一个脚本来定位扩展名,而不是硬编码所有各种DROP FUNCTION...命令。

1 个答案:

答案 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); │
└──────────────────────────────────────────────────────────────────────────────┘