不使用用户前缀访问另一个用户的Oracle模式对象

4

我有一个用户(UserA)的账户里有很多表。我可以执行 SELECT * FROM TABLE,一切正常。但是,如果我以只读连接的方式登录不同的用户(UserB),我就无法访问该表了。我必须使用SELECT * FROM UserA.TABLE

在Oracle中是否有一种方法可以允许UserB访问UserA的表而不必在表名前加上用户前缀?

2个回答

11

以UserB身份登录后,运行以下语句:

ALTER SESSION SET current_schema = UserA;

之后您就不必在表名前加前缀了。

如果您不想手动运行,可以创建一个登录触发器自动完成这个操作。


用户B不能设置权限吗? - Jon
改变当前模式是我所知道的唯一方法。使用登录触发器将是实现这个“自动化”的方式。 - user330315

11

你也可以通过在表上创建同义词来实现此目的:

CREATE SYNONYM TABLE FOR UserA.TABLE;

我假设我需要为UserA拥有的每个表创建一个同义词吗? - Jon
1
@Jon,不幸的是,你确实可以通过在ALL_TABLES系统表上运行查询来快速创建一个脚本:SELECT 'CREATE SYNONYM ' || TABLE_NAME || ' FOR ' || OWNER || '.' || TABLE_NAME || ';' FROM ALL_TABLES WHERE OWNER = 'UserA'; - markblandford
如果您也想要视图,则可以尝试使用ALL_OBJECTS系统表,并通过OBJECT_TYPE字段进行过滤。 - markblandford
谢谢。SYNONYM只应该存在于表、视图和存储过程中吗?我认为你不会为索引等创建它们。 - Jon
正确。有关更多详细信息,请参阅Oracle文档:http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm 您还应该知道,同义词仅适用于创建它的用户,除非您使用“PUBLIC”关键字,使其对所有用户可用。 - markblandford
显示剩余2条评论

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