【问题标题】:In ORACLE DB, determine if another user can run a select query在 ORACLE DB 中,确定其他用户是否可以运行选择查询
【发布时间】:2013-07-18 19:03:40
【问题描述】:

是否可以检查其他 ORACLE 用户是否能够运行特定查询?此检查需要由 ADMIN 帐户执行。

原因是我们有使用 ADMIN 帐户运行的进程。非管理员可以向这些进程提交查询,因此我们希望能够在进程执行期间确认用户是否能够自己运行查询,如果不能,则结束执行。

另一个方面是进程是由Java程序控制的,所以如果Oracle没有办法做到这一点,也许Java/JDBC有解决方案?

Java:1.5 甲骨文:10.2+ 涉及的所有表都是 ADMIN 模式的一部分,并且通过 SELECT/INSERT/UPDATE/DELETE 表 GRANTS 控制访问。

希望我已经足够清楚了

【问题讨论】:

  • 也许我过于简单化了,但您不会只需要 1 个以上的 ADMIN 连接到数据库吗? (如果用户是管理员,则以 ADMIN 身份连接,否则以功能较弱的用户身份连接,NON_ADMIN 或其他)。
  • 代理身份验证可能是值得尝试的。
  • @a_horse_with_no_name 很好的建议,谢谢。顺便说一句,关于代理身份验证的Oracle docs,读起来很有趣。

标签: java sql oracle jdbc


【解决方案1】:

在 SQL Server 中,解决方案称为 execute as login。鉴于此信息,我发现 Oracle 具有等价物(here 是 StackOverflow 参考):

ALTER SESSION SET CURRENT_SCHEMA = schema;

我的建议是在运行查询之前,将架构设置为实际用户。然后,让查询失败并将错误返回给调用程序。

这方面的 Oracle 文档是 here

编辑:

Oracle 的文档明确给出了这个例子:

CONNECT scott ALTER SESSION SET CURRENT_SCHEMA = joe;选择 * 从 员工;

因为emp不是schema-qualified,所以表名解析下 架构乔。但是如果 scott 没有对表的选择权限 joe.emp,则 scott 无法执行 SELECT 语句。

这给我的印象是它在更改架构时正在更改权限。

【讨论】:

  • 设置当前模式与“以登录方式执行”不同。它只是更改“默认模式名称”它不会更改当前用户(=登录)
  • @a_horse_with_no_name 。 . .我坦率地承认没有在 Oracle 中使用过它。但是,文档表明权限也在发生变化。
  • 对象的可见性在改变,但不是特权,来自您发布的链接:“会话保留其原始权限并且不会获得任何额外的特权”(强调我的)
  • 是的,我尝试过这种方法,但就像我提到的,由于所有必需的表都是 ADMIN 架构的一部分,因此更改架构对我没有多大帮助
【解决方案2】:

您可以尝试未记录的 Oracle 包 DBMS_SYS_SQL,它有一个将用户 ID 作为参数的parse() 方法。这是一个包含一些信息的链接:http://www.pythian.com/blog/using-dbms_sys_sql-to-execute-statements-as-another-user/

【讨论】:

  • 这是一个有趣的方法,感谢您指出。然而,通读后,这可能随时中断的复杂性和事实意味着它不是一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多