请教个问题。我一个报表报“ ERROR: operator is not unique: numeric = integer”错误。但是当前public模式下的“numeric = integer”操作符只定义了 一个。
那些操作符是我在B用户中创建的,切换到A用户下,再创建“numeric = integer”操作符问题就解决了。想问下,怎么让A用户使用B用户下的那个操作符?
本问题来自云栖社区【PostgreSQL技术进阶社群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在PostgreSQL中,操作符属于模式(schema)的一部分,不同的用户可能默认搜索的模式不同,或者没有权限访问其他用户创建的操作符。要让A用户能够使用B用户下定义的操作符,你可以采取以下几种方法:
修改搜索路径:你可以在A用户的会话中设置search_path
,使其包含B用户下操作符所在的模式。例如,如果B用户下的操作符位于名为b_user_schema
的模式中,A用户可以通过执行以下命令来临时修改其会话的搜索路径:
SET search_path TO b_user_schema, public;
这样做会让当前会话首先在b_user_schema
中查找操作符,然后是public
模式。但请注意,这仅影响当前会话,重启会话后需要重新设置。
永久修改搜索路径:如果希望每次A用户登录时都自动包含B用户模式,可以修改A用户的默认search_path
设置。这通常在A用户的角色定义中完成,或者通过ALTER ROLE命令:
ALTER ROLE A_USER_NAME SET search_path TO b_user_schema, public;
替换A_USER_NAME
为实际用户名。这样设置后,每次该用户登录,其默认的搜索路径都会包含指定的模式。
授权访问:确保A用户有足够的权限访问B用户模式下的对象。如果操作符所在的模式对A用户不可见或无权访问,你需要用超级用户或相应权限的用户执行GRANT命令,给A用户授予必要的权限:
GRANT USAGE ON SCHEMA b_user_schema TO A_USER_NAME;
如果还需要执行操作符,则可能还需要额外的权限,如:
GRANT EXECUTE ON OPERATOR b_user_schema.numeric = integer TO A_USER_NAME;
请根据实际情况调整上述命令中的模式名、操作符名称和用户名称。
重命名或复制操作符:如果以上方法都不适用或不便于管理,还可以考虑将B用户下的操作符重命名或复制到一个A用户可以直接访问的模式中,但这通常不是首选方案,因为可能会导致维护上的复杂性增加。
记得在进行任何更改之前,确保理解这些操作的影响,并在测试环境中先行验证,以避免对生产环境造成不必要的影响。