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