【发布时间】:2013-02-05 21:31:46
【问题描述】:
一个应用程序需要访问各种Oracle 数据库。有些数据库在 Schemas 中有表,有些则没有 - 对此无法控制。
如果数据库有一个正在使用的架构,除非用户输入一个架构,否则适用的将无法工作。我希望它能够通过 SQL 查询确定是否需要架构来访问表,以便可以提醒用户这一点。
我知道这个问题 - How do I obtain a list of schemas that an Oracle user has access to - 但这只告诉我可以访问哪些架构,而不是如果需要使用架构来访问表。
是否有对系统表之一的 SQL 查询可以使用该用户的权限执行此操作?
注意:应用程序只有登录凭据,不知道任何表的详细信息。
希望这很清楚。谢谢。
【问题讨论】:
-
Oracle 数据库中的所有对象都在模式中。如果您以其他用户身份登录,那么您必须使用架构名称来限定对另一个架构(即由另一个用户拥有)中的对象的访问权限。除非(a)有一个同义词,它可以是您登录的用户拥有的私有同义词,或者在您的情况下更可能(我认为)是公共同义词,您可以在
all_synonyms中检查;或当前架构已通过alter session更改(可以在登录触发器中完成。无论如何,您仍然可以始终使用架构。您要处理什么场景? -
@AlexPoole 是的,对不起。我对甲骨文的了解不够,无法知道我在问什么。 :-) - 问题是一些用户可以在不指定架构的情况下访问他们的数据,而有些则不能(取决于他们的数据库结构)。有些以拥有数据的用户身份登录,有些则不是。我希望能够确定他们何时输入连接凭据,是否也需要输入架构详细信息。
-
听起来你需要公共同义词
-
@tbone - 我想你误会了。无法控制数据库或数据结构。他们都是不同的。这纯粹来自应用程序方面 - 它需要能够适应这种多样性并确定连接是否需要“模式”。否则,它可能会使用不应该或不提供它需要的模式。
-
如果应用程序不知道将访问哪些表(它允许通用查询?),它不能提前测试。有些表可能有公共同义词,但其他表没有,所以单次测试无济于事。如果它们可能处于不同的模式中,那么
alter session也无济于事。总是以模式为前缀不会有什么坏处,它只是更多的打字。我能想到的唯一粗略猜测是查看您登录的用户是否拥有 any 表(user_tables);如果他们不这样做,那么他们将需要一个模式,除非有同义词,如果他们有,那么假设他们拥有他们想要访问的一切?
标签: oracle