这个PL/pgSQL代码出现了错误cross-database references are not implemented: scan.location.alias:
DECLARE
v_tmp_host scan.location.alias%TYPE;
v_ip_address character varying;
BEGIN
-- Some assignment to v_ip_address
v_tmp_host := v_ip_address::scan.location.alias%TYPE;由于代码工作了很长时间,我调查并发现,“扫描”是数据库中存在此触发器的模式,几天前有人创建了一个名为“扫描”的数据库。因为现在“扫描”既是一个数据库,也是一个模式,pg似乎使用db而不是模式。
我的问题是,将来怎样才能避免这些问题呢?我应该如何编写这段代码以避免通过创建额外的关系、数据库或模式而中断?
或者换句话说:在这种情况下,我如何强制pg使用模式而不是数据库?
发布于 2012-11-20 10:15:53
您必须将变量声明为所需的类型。%TYPE构造用于复制类型,因此它仅在DECLARE部分中可用。作为回报,任务将更简单:
DECLARE
v_tmp_host scan.location.alias%TYPE;
v_ip_address character varying;
BEGIN
v_ip_address := '127.0.0.1';
v_tmp_host := v_ip_address;
[...]对代码的唯一更改是,我完全忽略了赋值中的强制转换。在这种情况下,PostgreSQL不会尝试将scan解析为数据库名称,因为跨数据库引用没有实现.
如果您用某种类型声明了变量,则赋值将尝试将给定的值转换为该类型。万一失败,你就会有一个错误。因为普通的inet输入只是一个单引号字符串,所以varchar将被接受(如果它的格式符合inet输入格式)。
https://dba.stackexchange.com/questions/28973
复制相似问题