我有一个在我想编辑的数据库中定义的函数(存储过程)。
我认为这样做的一种方法是将函数定义转储到SQL文件,编辑SQL文件,然后用编辑后的版本替换数据库中的定义。
是否可以这样做(将定义转储到SQL文件中)?
我过去一直在做的是使用psql连接数据库,运行/ df +函数,将输出复制到文本文件,按下文本使其看起来像函数声明,但这很耗时而且我想知道是否有更简洁的方法。
如果重要的话,我正在使用PostgreSQL 9.1。
编辑:
我接受了Mike Buland的回答,因为他在评论中提供了正确答案,即在psql中运行\ ef函数。
答案 0 :(得分:5)
这实际上列在上一个问题中:
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的当前文本并使用它执行任何操作:)
我希望有帮助
答案 1 :(得分: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脚本以重新创建对象,并且可以选择将其自动复制到编辑窗口。编辑并执行。
答案 2 :(得分:1)
我认为你需要退一步看看根本问题。您是不是使用版本控制来对文件(数据库对象)进行版本控制。有很多免费的,Git和Mercurial等等。因此,使用psql或Mike提供的查询来转储结构并将它们放在版本控制中。继续从版本控制中检出并在那里进行编辑。您应该将此版本控制系统中的代码部署到数据库服务器。协调版本控制中的代码与自动和定期的数据库中的代码匹配也很有用。从理论上讲,如果有一个严格的流程,那么未经检查到源代码控制的代码就不应该进入数据库,你也不必怀疑源代码控制是否与数据库的匹配。但是,我不相信有管理员访问权限的人不会滥用他们的权限,所以我会采取措施来检查这一点。如果发现有人滥用他们可以通过其他方式处理的特权。