10

我在要编辑的数据库中定义了一个函数(存储过程)。

我认为这样做的一种方法是将函数定义转储到 SQL 文件,编辑 SQL 文件,然后用编辑后的版本替换数据库中的定义。

是否可以这样做(将定义转储到 SQL 文件)?

我过去一直在做的是使用 psql 连接到数据库,运行 /df+ 函数,将输出复制到文本文件,按摩文本使其看起来像函数声明,但这很耗时而且我我想知道是否有更时尚的方法。

如果重要的话,我正在使用 PostgreSQL 9.1。

编辑:

我接受了 Mike Buland 的回答,因为他在评论中提供了正确的答案,即在 psql 中运行 \ef 函数。

4

3 回答 3

6

这实际上列在上一个问题中:

SELECT  proname, prosrc
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

列出引用 PostgreSQL 中表的存储函数

您应该能够在命令行上或与客户端一起使用它来读取 proc 的当前文本并使用它做任何您想做的事情:)

我希望这会有所帮助

于 2012-01-20T16:34:57.187 回答
3

您还需要函数参数:

SELECT p.proname
     , pg_catalog.pg_get_function_arguments(p.oid) as params
     , p.prosrc
FROM   pg_catalog.pg_proc p
WHERE  oid = 'myschema.myfunc'::regproc;

或者,为了使带参数的函数更加明确:

WHERE  oid = 'myschema.myfunc(text)'::regprocedure;

或者,您可以使用pgAdmin更轻松地完成您所描述的事情。它显示完整的 SQL 脚本以重新创建对象,并具有自动将其复制到编辑窗口的选项。编辑并执行。

于 2012-01-20T17:50:13.550 回答
0

我认为你需要退后一步,看看这里的根本问题。您没有使用版本控制来对文件(数据库对象)进行版本控制。有很多免费的,Git 和 Mercurial 等等。因此,使用 psql 或 Mike 提供的查询将结构转储出来并将它们置于版本控制中。继续从版本控制中检出并在那里进行编辑。您应该将此版本控制系统中的代码部署到数据库服务器。协调版本控制中的代码自动和定期与数据库中的代码匹配也很有用。从理论上讲,如果有一个严格的流程,那么没有签入源代码控制的代码永远不应该进入数据库,而且您不必怀疑源代码控制是否与数据库的内容相匹配。然而我不 不相信具有管理员访问权限的人不会滥用他们的权限,所以我采取了措施来检查这一点。如果发现有人滥用他们的特权,可以通过其他方式处理。

于 2012-01-20T16:37:26.547 回答