2016-11-23 2 views
1

У меня есть вид, созданный под пользователем «dbaUserA». В запросе запроса используется таблица от другого пользователя «dbaUserB». Оба пользователя - dba.Oracle: не удается запросить представление другой схемы, которая также связала таблицы с другой схемой

имя вида: v_valid_trx с запросом о

Select trx_no,trx_date,order_item 
from trx_table a left outer join dbaUserB.cancelled_trx b on a.trx_no=b.trx_no 
where b.trx_no is null; 

Я создал меньше привилегий пользователя "userC", но с выбора привилегии на

dbaUserA.trx_table 
dbaUserB.cancelled_trx. 
dbaUserA.v_valid_trx 

можно выбрать непосредственно trx_table и canceled_trx из этих разных схем, однако я не могу выбрать на вид v_valid_trx.

Oracle запрашивает

ORA-01031: недостаточные привилегии 01031. 00000 - "недостаточно привилегий" * Причина: Была сделана попытка изменить текущее имя пользователя или пароль без соответствующей привилегии. Эта ошибка также возникает, если пытается установить базу данных без необходимых системных привилегий . Когда Trusted Oracle настроен на СУБД СУБД, эта ошибка может возникнуть , если пользователю была предоставлена ​​необходимая привилегия на более высоком ярлыке , чем текущий логин. * Действие: попросите администратора базы данных выполнить операцию или предоставить требуемые привилегии. Для доверенных пользователей Oracle, получивших эту ошибку, хотя предоставил соответствующие привилегии на более высоком ярлыке, попросите администратор базы данных восстановить права на соответствующую метку. Ошибка на линии: 1 Колонка: 21

Борьба с ними часами. Я не могу понять причину ошибки, когда я могу свободно выбирать базовые таблицы.

пожалуйста, помогите :)

+1

Я бы предположил, что dbaUserB должен «предоставить select on cancelled_trx в dbausera с помощью опции гранта», хотя это немного догадка без полного тестового примера. dbaUserB дал разрешение dbaUserA запрашивать его, а не делиться им с кем-либо еще. –

+0

Также обратите внимание, что доступ к командной строке для базовых таблиц может осуществляться через роль (например, DBA), которая не будет использоваться для базовых таблиц в представлениях. –

+0

Когда я делал гранты для представления, я все время был на консоли как sysdba. Я снова предоставил select в базовой таблице dbauserA с параметром grant. Большое спасибо Уильяму за правильную догадку. :) Не знал, что привилегии оракула работают именно так. – yonas

ответ

0

Когда пользователь A предоставляет разрешения для таблицы пользователю B, это не дает разрешению B предоставлять эти данные кому-либо еще, даже через представление. Для этого необходимо использовать расширенный синтаксис разрешения WITH GRANT OPTION.

Например, USER_A создает таблицу и предоставляет SELECT для нее USER_B.(Для того, чтобы понять, кто работает каждую команду, я сделал их SQL> предлагающим отражает их имя пользователя.)

USER_A> create table cancelled_trx(dummy varchar2(1)); 

USER_A> grant select on cancelled_trx to USER_B; 

Это не дает разрешения передать Пользователь B гранта на пользователь C:

USER_B> grant select on USER_A.cancelled_trx to USER_C; 
           * 
ERROR at line 1: 
ORA-01031: insufficient privileges 

сообщение об ошибке более специфичен для просмотров:

USER_B> create or replace view test_view as select * from USER_A.cancelled_trx; 

View created. 

USER_B> grant select on test_view to USER_C 
         * 
ERROR at line 1: 
ORA-01720: grant option does not exist for 'USER_A.CANCELLED_TRX' 

чтобы разрешить это, владелец (user_a) придется

USER_A> grant select on cancelled_trx to USER_B with grant option; 

Другой вопрос, поднятый вашим вопросом, - это объем ролей. Гранты, предоставляемые для ролей, не применяются в отношении взглядов или процедур определения прав. Поэтому, если USER_A предоставил select на canceled_trx в ROLE_X, а USER_B имел ROLE_X, USER_B мог запросить canceled_trx, но не использовать его в представлении или хранимой процедуре.

0

Вы можете первым, что, чтобы подтвердить, что действительно имеет userC выберите разрешения на вид dbaUserB.v_valid_trx.

Я считаю, что разрешения хранятся в SYSTABLEPERMS.

Я знаю, по крайней мере, одну другую СУБД, которая никогда не ошибается при применении разрешений, даже если заявление о гранте бессмысленно.

Кроме того, я не уверен, что вам необходимо предоставить определенные разрешения для userC для базовых таблиц, разве это не цель представления?

Сообщите нам, как вы поживаете.

+0

Это Oracle, поэтому это «DBA | ALL | USER_TAB_PRIVS%», а userC необходимо предоставить разрешения. –

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