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

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

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

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

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

3 ответов


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

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

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

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

вы можете поместить пакет в каждую схему, которую вам нужно выдать грант, из которого будет проходить все вызовы каждого оператора гранта через 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;

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

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


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

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;