【问题标题】:PostgreSQL: How do I export a function definition to SQLPostgreSQL:如何将函数定义导出到 SQL
【发布时间】:2012-02-15 04:38:40
【问题描述】:

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

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

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

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

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

编辑:

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

【问题讨论】:

    标签: postgresql postgresql-9.1


    【解决方案1】:

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

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

    List stored functions that reference a table in PostgreSQL

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

    希望对你有帮助

    【讨论】:

    • 感谢您的回答,但它并没有比 \df+ 已经做的更多。我想我希望能包含完整的 SQL,包括“CREATE OR REPLACE FUNCTION ...(...)”部分,这样我就不必每次都按摩输出。
    • 啊,我误会了,对于较新的 postgres 尝试:\ef
    • 谢谢,这正是我想要的。
    【解决方案2】:

    您还需要函数参数:

    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 脚本以重新创建对象,并具有自动将其复制到编辑窗口的选项。编辑并执行。

    【讨论】:

    • @Fëanor:我删除了屏幕截图,不需要它。也简化了查询。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的坦率,并会考虑您的批评,尽管我认为您对我的问题的解读过多。
    • 就您的问题而言,我同意。但是,如果你和我一起工作,我会给你的答案就是我在这里提交的答案。我讨厌解决上游的缺陷。也许在你的情况下这有点苛刻,因为我不知道你是否只是被一个有这些缺陷的系统困住了,你需要暂时解决它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2023-03-20
    • 2017-02-22
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多