Postgresql 在函数中更改架构名称

Postgresql 在函数中更改架构名称,postgresql,function,database-design,database-schema,Postgresql,Function,Database Design,Database Schema,我在数据库1中有schema1。我想将schema1的所有函数移到数据库2中的schema2。我已将数据库1的备份文件还原到数据库2。并更改了架构名称。函数调用的架构名称已自动更改。但在函数定义中,模式名称没有更改。例如: CREATE OR REPLACE FUNCTION schema2.execute(..) BEGIN select schema1."VALIDATE_SESSION"(....) end 如何自动将“schema1”更改为“schema2” 我尝试将当前模式名存储在

我在数据库1中有schema1。我想将schema1的所有函数移到数据库2中的schema2。我已将数据库1的备份文件还原到数据库2。并更改了架构名称。函数调用的架构名称已自动更改。但在函数定义中,模式名称没有更改。例如:

CREATE OR REPLACE FUNCTION schema2.execute(..)
BEGIN 
select schema1."VALIDATE_SESSION"(....)
end
如何自动将“schema1”更改为“schema2”
我尝试将当前模式名存储在变量中,并将其附加到表中。但是调用
current\u schema()
返回“public”。如何获取用户创建的当前架构?因为每次生成脚本时,我都需要更改架构名称。

伪函数中缺少的基本细节是函数体周围的单引号(或美元引号,都是一样的)。也就是说,函数体保存为字符串。见:

对比,在FK约束中考虑对一个表的引用(或者更详细地说:<代码> schema .table(列)< /代码>)。对象名称在创建时解析为表的内部OID(和列编号)“早期绑定”。稍后更改名称(包括架构名称)时,这对FK没有任何影响。感觉涉及的名称是动态更改的。但实际上,创建对象后,实际名称并不重要。因此,您可以全天重命名模式,而不会对FK产生副作用

函数体中的名称存储为字符串,并在调用时进行解释“后期绑定”。这些名称不会动态更改

也就是说,您必须实际编辑所有函数体,包括硬编码的模式名称。一种可能的替代方法是依赖
搜索路径
,而不是在函数体中使用模式名称。有很多种。见:

但这并不总是可以接受的

你可以去垃圾场。或者在Postgres中使用sting操作来更新受影响的函数体。使用元查询查找受影响的函数,如:

SELECT *
FROM   pg_catalog.pg_proc
WHERE  prosrc ~ '\mschema1\M';  -- not bullet-proof!

无论哪种方式,如果模式名称可以是其他字符串的一部分或作为列名等弹出,则要小心错误匹配,并且动态SQL可以以任意方式连接字符串。如果您的函数中存在这种邪恶的诡计,您需要适当地处理它。

伪函数中缺少的基本细节是函数体周围的单引号(或美元引号,都是一样的)。也就是说,函数体保存为字符串。见:

对比,在FK约束中考虑对一个表的引用(或者更详细地说:<代码> schema .table(列)< /代码>)。对象名称在创建时解析为表的内部OID(和列编号)“早期绑定”。稍后更改名称(包括架构名称)时,这对FK没有任何影响。感觉涉及的名称是动态更改的。但实际上,创建对象后,实际名称并不重要。因此,您可以全天重命名模式,而不会对FK产生副作用

函数体中的名称存储为字符串,并在调用时进行解释“后期绑定”。这些名称不会动态更改

也就是说,您必须实际编辑所有函数体,包括硬编码的模式名称。一种可能的替代方法是依赖
搜索路径
,而不是在函数体中使用模式名称。有很多种。见:

但这并不总是可以接受的

你可以去垃圾场。或者在Postgres中使用sting操作来更新受影响的函数体。使用元查询查找受影响的函数,如:

SELECT *
FROM   pg_catalog.pg_proc
WHERE  prosrc ~ '\mschema1\M';  -- not bullet-proof!

无论哪种方式,如果模式名称可以是其他字符串的一部分或作为列名等弹出,则要小心错误匹配,并且动态SQL可以以任意方式连接字符串。如果您的函数中存在这种邪恶的诡计,您需要适当地处理它。

我非常确定,在导出架构时,在生成脚本文件时,将有一个选项跳过架构名称。请调查一下。。。。如何备份脚本?目标数据库中是否存在schema1?如果没有,您可以简单地将备份恢复到目标数据库,然后将schema1重命名为schema2@a_horse_with_no_nameschema1位于源数据库中。更改目标数据库中的架构名称只更改函数声明架构,而不更改函数定义中的架构。我直接从pgadmin获取备份。有一个选项可以在数据库级别@VivekAm进行备份,非常确定在导出模式时,在生成脚本文件时会有一个选项跳过模式名称。请调查一下。。。。如何备份脚本?目标数据库中是否存在schema1?如果没有,您可以简单地将备份恢复到目标数据库,然后将schema1重命名为schema2@a_horse_with_no_nameschema1位于源数据库中。更改目标数据库中的架构名称只更改函数声明架构,而不更改函数定义中的架构。我直接从pgadmin获取备份。可以选择在数据库级别@Vivek进行备份