Правильный способ предоставления пользователям доступа к дополнительным схемам в 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;