如何编辑PostgreSQL存储过程?

19

我正在逐步从MSSQL转向PostgreSQL。

在MSSQL中,我可以调用已保存的存储过程或函数进行编辑,并且管理控制台(SQL Server Management Studio)会显示过程的文本,因此我不必将其源代码存储在文本文件中。

如何以方便的方式在PostgreSQL中完成相同操作?我正在使用pgAdmin III。


4
将您的存储过程存储在外部文件中是非常推荐的(最好在版本控制系统中),这样做可以使内容更易于理解。 - user330315
@a_horse_with_no_name: 我更喜欢另一种方法。我为每个生产数据库集群(不经常复制)都有一个测试数据库集群,我在其中进行实验。当被认为是好的时候,我会在生产数据库集群中执行。除了通常的备份之外,我还运行频繁的仅模式备份,特别是在对模式进行更改之前/之后。传统的代码库对于数据库模式的用途有限,因为数据不断变化,许多更改无法(轻松地)被还原。 - Erwin Brandstetter
1
@ErwinBrandstetter:这种方法的问题在于,你会失去一个概述,即你需要应用哪些更改才能将数据库从版本x升级到版本x+1。你需要一个集中的地方来跟踪每个更改(最好还可以映射到问题票据)。如果你有多个环境(开发、测试、暂存、验证、回归、预生产、生产),甚至可能在生产中有多个版本(考虑不同的国家),我不认为你可以在没有VCS的情况下跟踪所有更改。 - user330315
@a_horse_with_no_name:当然,我的方法也有其局限性。如果环境变得更加复杂,就像你所描述的那样,可能需要使用版本控制系统(VCS)。但对于大多数用户来说,这应该是个不错的解决方案。 - Erwin Brandstetter
1
@Ervin - 使用外部文件具有非常重要的优势:版本控制系统(VCS),可以使用首选编辑器,更好地组织和注释代码。但是使用您的部署系统也是一个好主意,并且与使用文件的建议并不冲突。 - Pavel Stehule
5个回答

28

Postgres官方发布的两个客户端包括终端版psql和图形界面版pgAdmin,均支持你所需的功能:对于psql,可以使用\ef命令;对于pgAdmin,请右键单击函数,选择“属性”,然后进入“代码”选项卡。


3
@redolent,如果你已经关闭了编辑器,那么你可能需要手动在打开的文件末尾添加“;”,或者只需添加一个分号“;”,然后按Enter键即可。请注意不要改变原来的意思。 - 10gistic
1
ef可以工作,但是无法通过在VIM程序员文本编辑器中编辑SQL来保存函数。 - Oleksii Kyslytsyn
确认在关闭 vim 后加一个分号 ; 可以按预期工作。因此:\ef function;进行更改;从 vim 中退出,使用 ZZ/wq/等命令;在 psql 命令行中输入分号 ; - bishop

4
pgAdmin 中,如果您激活以下选项,可以使您的生活更轻松:
文件 -> 选项.. -> 查询工具 -> [x] 从主窗体复制 SQL 到 SQL 对话框 然后,无论在 SQL 窗格中显示什么内容,都将被复制到新打开的查询工具窗口中。因此,在对象浏览器中选择函数并单击工具栏中的放大镜图标。
请注意,当前版本1.14.2中存在一个已知问题。默认情况下,public 具有函数的 EXECUTE 权限。您可以撤销此权限 - 这仅对 SECURITY DEFINER 函数有用。但是,pgAdmin 的反向工程 DDL 语句中缺少此 REVOKE(一个 NULL 被误认为是空 ACL)。如果您删除并重新创建这样的函数,请小心!

4

这也是一种方便的方式,可以编辑代码并进行测试。

1) 从pgAdmin中提取所需的SQL函数代码。

2) 将函数的代码与文件.sql放在一起。

3) 在与file.sql相同的目录下创建一个shell/bat文件:

psql -U postgres dbname < file.sql

4) 将shell/bat文件的快捷方式放入快速面板中。

5) 使用您喜欢的文本编辑器编辑文件,并按快捷方式来更新功能。


总的来说,我认为您的贡献很有帮助,但在这种特定情况下,您的建议恰恰是Paul不想做的事情:“因此我不必将其源代码存储在文本文件中” - 可能是因为他认为这种方法过于复杂,不能称之为“方便”。 - ChristophK

1

phpPgAdmin将允许您在界面内编辑存储过程。在您的问题下留下有关外部存储以进行版本控制的评论也强烈推荐。


1

在对象树中(左侧),右键单击功能 -> 脚本 -> 创建脚本

-或者-

执行新的SQL查询 -> 将“创建或替换函数…”的代码复制到其中

然后编辑脚本,不要忘记执行它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接