Привилегии oracle jdbc getMetaData

Я использую драйвер JDBC для подключения к другому типу базы данных. Пользователи моей базы данных имеют права только на просмотр каталога. Он отлично работает для hive / teradata, но не с Oracle.

С Oracle я могу получать схемы, но не таблицы / столбцы.

Привилегии Oracle:

SELECT_CATALOG_ROLE, CREATE SESSION, CONNECT

Код Java:

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

Но как только я даю разрешение select для таблиц, это работает.

Я что-то упускаю?

какую версию драйвера JDBC вы используете? Он просто запрашивает all_objects o, all_tab_comments, поэтому выбранный каталог должен работать как минимум в версии 18.3.

Kris Rice 21.11.2018 13:49

Привет, Крис, all_objets не содержит таблиц других пользователей

nbsr 21.11.2018 14:00

Все в all_objets предназначено для пользователей все, уважающих то, что предоставлено. user_objects - это только текущая схема.

Kris Rice 21.11.2018 14:02

Спасибо, Крис, можно ли предоставить доступ к метаданным без предоставления доступа к данным?

nbsr 21.11.2018 14:54

да. Выполните sql

Kris Rice 21.11.2018 14:55

Да ; запросить представление dba_tables напрямую, поскольку у вас есть роль select_catalog

Kris Rice 21.11.2018 14:56

Я имел в виду, можно ли предоставить доступ к метаданным без предоставления доступа к данным и получить метаданные через драйвер JDBC? Без запросов, потому что я использую методы JDBC (getMetadata, getSchemas, getTables ...). Поскольку это общая программа для разных типов баз данных

nbsr 21.11.2018 15:03

Только не с драйвером, использующим all_ views.

Kris Rice 21.11.2018 19:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
1 231
3

Ответы 3

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 без предоставления доступа к их данным?

nbsr 21.11.2018 12:51

Использование DatabaseMetaData.getMetaData отвечает на базовые представления all_objects, all_tab_comments и all_synonyms. Эти представления принимают во внимание то, что предоставлено для доступа.

SELECT_CATALOG_ROLE предоставляет доступ к каталогу, который позволяет запрашивать dba_objects.

Чтобы сделать то, о чем просят, можно легко написать зеркальный Java API для DatabaseMetaData.getMetaData (). GetTables (..) с использованием представлений 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));
            }    

    }

}

У меня была такая же проблема с 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;

Мне это нравится.

Другие вопросы по теме