【问题标题】:How do I determine if I a user requires a schema to access a table?如何确定我的用户是否需要架构才能访问表?
【发布时间】: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


【解决方案1】:

问题令人困惑。在 Oracle 中的大多数情况下,您可以考虑 LOGIN == USER == SCHEMA。当您使用您的用户登录数据库时,您可以查看和访问该用户架构中的所有对象。
SCHEMA2.TABLE1 可以访问其他模式中的对象(在同一数据库服务器上),如果连接的用户具有访问表的权限(有不同的权限......)。正如在某些 cmets 中已经说明的那样,如果存在同义词,则不需要为 table 添加前缀。
如果存在适当的数据库链接,您的用户甚至可以访问某个远程服务器上的表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多