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

У меня есть два пользователя Bob и Alice в Oracle, оба созданные путем запуска следующих команд как sysdba из sqlplus:

   create user $blah identified by $password;
   grant resource, connect, create view to $blah;

Я хочу, чтобы у Боба был полный доступ к схеме Алисы (т.е. все таблицы), но я не уверен, какой грант для запуска, и нужно ли запускать его как sysdba или как Алиса.

С удовольствием узнаем о любых хороших указателях для ссылки на материал - не похоже, чтобы получить хороший ответ на это из Интернета или "Oracle Database 10g Complete Reference", который сидит на моем письменный стол.

Ответы

Ответ 1

AFAIK вам нужно сделать объект грантов по одному за раз.

Обычно для этого нужно использовать script, что-то вроде строк:

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

И аналогично для других объектов db.

Вы можете поместить в каждую схему пакет, который вам нужно будет выдать грант, из которого будет проходить весь вызов каждого заявления GRANT через EXECUTE IMMEDIATE.

например.

   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;

Ответ 2

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

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

Ответ 3

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

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;