【问题标题】:privileges oracle jdbc getMetaData权限 oracle jdbc getMetaData
【发布时间】:2018-11-21 11:06:33
【问题描述】:

我正在使用 JDBC 驱动程序连接到不同的数据库类型。 我的数据库的用户只有目录的查看权限。 它适用于 hive/teradata,但不适用于 Oracle。

使用 Oracle,我可以检索架构,但不能检索表/列。

Oracle 权限:

SELECT_CATALOG_ROLE、创建会话、连接

Java 代码:

DatabaseMetaData databaseMetadata = con.getMetaData(); resTables = databaseMetadata.getTables("Test_Schema", null, null, 空);

但是一旦我授予对表的选择权限,它就可以工作。

我错过了什么吗?

【问题讨论】:

  • 你用的是什么版本的JDBC驱动?它只是查询 all_objects o, all_tab_cmets 所以选择目录至少应该在 18.3 中工作。
  • 嗨 Kris,all_objets 不包含其他用户表
  • all_objets 中的所有内容适用于 所有 用户,尊重已授予的内容。 user_objects 只是当前架构。
  • 谢谢 Kris,是否可以在不授予数据访问权限的情况下授予对元数据的访问权限?
  • 是的。执行sql

标签: java oracle


【解决方案1】:

使用 DatabaseMetaData.getMetaData 回复底层视图 all_objects 、 all_tab_cmets 和 all_synonyms。这些视图考虑了授予访问权限的内容。

SELECT_CATALOG_ROLE 授予对允许查询 dba_objects 的目录的访问权限。

要执行所要求的操作,可以轻松编写 DatabaseMetaData.getMetaData().getTables(..) 的镜像 Java API 以使用 dba_xyz 视图。类似的东西。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDatabaseMetaData;

public class MyMetaData extends OracleDatabaseMetaData {



    public MyMetaData(Connection conn) {
        super((OracleConnection) conn);
    }

    public synchronized ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
        // catalog isn't used
        // dba view based sql  

        String sql = "SELECT NULL AS table_cat,"+
        "       o.owner AS table_schem,\n       "+
        "       o.object_name AS table_name,\n  "+
        "       o.object_type AS table_type,\n"+
        "       c.comments AS remarks\n" +
        "  FROM dba_objects o, dba_tab_comments c\n"+
        "  WHERE o.owner LIKE :1 ESCAPE '/'\n    "+
        "  AND o.object_name LIKE :2 ESCAPE '/'\n"+
        "  AND o.owner = c.owner (+)\n    "+
        "  AND o.object_name = c.table_name (+)\n";

        // bind params

         PreparedStatement stmt = connection.prepareStatement(sql);
         stmt.setString(1, schemaPattern == null ? "%" : schemaPattern);
         stmt.setString(2, tableNamePattern == null ? "%" : tableNamePattern);

        return stmt.executeQuery();
    }

    public static void main(String[] args) throws SQLException {

        String conString = "jdbc:oracle:thin:@//localhost:1521/xe";
        Properties props = new Properties();
        props.setProperty("user", "klrice");
        props.setProperty("password", "klrice");
        Connection conn = DriverManager.getConnection(conString, props);
        // use this class
        MyMetaData md = new MyMetaData(conn);

        // test it out
        ResultSet rset = md.getTables(null, "ORDS_METADATA", null, null);
            while (rset.next()) {
                System.out.println(rset.getString(2));
            }    

    }

}

【讨论】:

    【解决方案2】:

    SELECT_CATALOG_ROLE 允许对数据字典视图具有 SELECT 权限(例如 select * from dba_users) ,但不适用于用户表。 例如,您必须明确指定所需表的权限 grant select,update,delete on need_table for user_name; grant select,update,delete on DEPARTMENTS to test;

    或授予所有表格的选择权(不好的做法)。

    [oracle10@aktp ~]$ sqlplus / as sysdba
    
    SQL*Plus: Release 10.2.0.4.0 - Production on Wed Nov 21 14:39:55 2018
    
    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
    
    
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> grant select any table to test;
    
    Grant succeeded.
    

    .

    【讨论】:

    • 嗨,德米特里,谢谢。这是否意味着如果不授予对 dba_users 元数据的访问权限,就无法授予对他们数据的访问权限?
    【解决方案3】:

    我对 jdbc 也有同样的问题。我的解决方案就是这么简单。

    create or replace synonym youruser.all_objects for dba_objects;
    create or replace synonym youruser.all_tables for dba_tables;
    create or replace synonym youruser.all_tab_columns for dba_tab_columns;
    create or replace synonym youruser.all_users for dba_users;
    create or replace synonym youruser.all_constraints for dba_constraints;
    create or replace synonym youruser.all_cons_columns for dba_cons_columns;
    

    这对我很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多