2008-10-13 6 views
13

У меня есть два пользователя Алиса и Боб в Oracle, как создатель, выполнив следующие команды как SYSDBA из SQLPLUS:Правильный способ, чтобы предоставить пользователям доступ к дополнительным схемам в Oracle

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

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

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

ответ

20

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

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

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

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

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

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

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

6

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

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^