【发布时间】:2014-02-17 04:39:40
【问题描述】:
为了从 pgdump 中恢复我的数据,我需要从数据库中删除自定义函数。
这个函数可以很好地识别它们:
SELECT pp.proname
FROM pg_proc pp
INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid)
INNER JOIN pg_language pl on (pp.prolang = pl.oid)
WHERE pl.lanname NOT IN ('c','internal')
AND pn.nspname NOT LIKE 'pg_%'
AND pn.nspname <> 'information_schema';
所以,在我听到 dynamic SQL 并确保我可以从 .NET 中使用它之后,我立即尝试将它应用到那个目的。
do
$$
declare
func_rec record;
begin
for func_rec in (SELECT pp.proname as funcname
FROM pg_proc pp
INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid)
INNER JOIN pg_language pl on (pp.prolang = pl.oid)
WHERE pl.lanname NOT IN ('c','internal')
AND pn.nspname NOT LIKE 'pg_%'
AND pn.nspname <> 'information_schema')
loop
execute 'drop function '||func_rec.funcname||' cascade';
end loop;
end;
$$
与此同时,我发现要删除一个函数,我必须将其参数提供给 DROP 命令。
这是一个关于如何检索这些参数的example 子查询:
(SELECT typname FROM pg_type WHERE oid = funcrow.proargtypes[i])
现在仍然存在一个问题,我不知道如何将它们放入功能代码中,这会将所需的参数添加到 func_rec.funcname 以删除此类函数。
所以,请帮助获取从所有函数中删除自定义函数的查询。
【问题讨论】:
标签: postgresql