Правильный способ дать пользователям доступ к дополнительным схемам в Oracle - PullRequest
13 голосов
/ 14 октября 2008

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 14 октября 2008

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

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

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

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

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

1010 *, например *

   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;
7 голосов
/ 14 октября 2008

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

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

6 голосов
/ 07 мая 2010

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...