Правильный способ дать пользователям доступ к дополнительным схемам в Oracle

/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}
13
задан Jacob 14 October 2008 в 07:39
поделиться

3 ответа

AFAIK необходимо сделать объект предоставлений по одному.

Обычно Вы использовали бы сценарий, чтобы сделать это, что-то вроде:

SELECT 'GRANT ALL ON '||table_name||' TO BOB;'
FROM   ALL_TABLES
WHERE  OWNER = 'ALICE';

И подобный для других объектов дб.

Вы могли поместить пакет в каждую схему, что необходимо выпустить предоставление, от которого пройдет весь вызов каждый оператор GRANT через ВЫПОЛНЕНИЕ НЕПОСРЕДСТВЕННОГО.

, например,

   PROCEDURE GRANT_TABLES
   IS
   BEGIN

      FOR tab IN (SELECT table_name
                  FROM   all_tables
                  WHERE  owner = this_user) LOOP
         EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user';
      END LOOP;
   END;
20
ответ дан cagcowboy 14 October 2008 в 07:39
поделиться

Существует много вещей рассмотреть. Когда Вы говорите, что доступ, хотите снабдить префиксом таблицы другое пользовательское имя? Можно использовать общедоступные синонимы так, чтобы можно было скрыть первоначального владельца, если это - проблема. И затем предоставьте privs на синониме.

Вы также хотите запланировать заранее как лучше всего, Вы можете. Позже, Вы захотите, чтобы Frank смог получить доступ к схеме Alice также? Вы не хотите должными быть повторно предоставлять полномочия на количестве N таблиц. Используя роль базы данных было бы лучшее решение. Предоставьте выбор роли "ALICE_TABLES", например, и когда другому пользователю нужен доступ, просто предоставьте им полномочие роли. Это помогает организовать предоставления, которые Вы делаете в DB.

7
ответ дан Brett McCann 14 October 2008 в 07:39
поделиться

Другое решение, если у вас другой владелец:

BEGIN

  FOR x IN (SELECT owner||'.'||table_name ownertab
            FROM   all_tables
            WHERE  owner IN ('A', 'B', 'C', 'D'))
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user';
  END LOOP;
END;
6
ответ дан 1 December 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: