2013-11-01 5 views
0

В oracle 11g у меня есть схема владельца, которая содержит соответствующие таблицы, необходимые для приложения.Выберите доступ ко всем таблицам

Для моего внешнего приложения я пытаюсь создать другого пользователя, который должен иметь доступ к определенным таблицам в приведенной выше схеме. Назовём владельца схемы А и новой схемы B

create user B identified by blah; 
    grant connect to B; 

После входа в исходную схемы А я побежал следующее (для демо я даю отборное на всех таблицах)

begin 
    FOR x IN (select * from user_tables) 
    LOOP 
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO some_role'; 
    END LOOP; 
    end; 

    grant some_role to B; 

Если бы я войдите в систему как пользователь B и выполните запрос, например

select count(*) from A.some_table ; 

это работает. Но без создания общедоступного синонима возможно ли мне предоставить таким образом, что при входе в систему как пользователь B?

select count(*) from some_table; 

Благодаря

ответ

0

Вы можете создавать приватные синонимы для пользователя B для использования. Как пользователь B, запустите следующий блок:

begin 
FOR t IN (SELECT * FROM role_tab_privs WHERE grantee = 'SOME_ROLE' and owner = 'A') 
LOOP 
    EXECUTE IMMEDIATE 'CREAETE SYNONYM ' || table_name || ' FOR A.' || table_name'; 
END LOOP; 
end; 
+0

, когда я запускаю выше выберите в качестве пользователя B, я получаю пустые строки .. даже выбрать * из user_tab_privs для пользователя B дает пустые строки – cableload

+0

жаль, что я делал это через роли ... поэтому выберите * от role_tab_privs работает !! – cableload

+0

@cableload спасибо, по какой-то причине не заметил роли. Я соответствующим образом изменил свой ответ. – Mureinik

0

если вы просто чтение данных из таблиц, принадлежащих USERB, вы можете установить ниже команду и запустить ВЫБРАТЬ на столах, как если бы они были в ПользовательА схеме:

alter session set current_schema=userB 

(регистрируется как UserA)

Затем ниже две команды будут эквивалентны (имеют одинаковый результат):

select ... from userB.TABLE1 

select ... from TABLE1 
Смежные вопросы