Выбор гранта на столе - PullRequest
       6

Выбор гранта на столе

0 голосов
/ 18 сентября 2018

Я пытаюсь настроить User_2 в Oracle, и этот пользователь должен получить SELECT для таблицы User_1. Независимо от того, что я делаю, создаю роль и предоставляю выбор роли или предоставляю User_2 SELECT напрямую, все, что я получаю, это «Таблица или представление не существует». Однако, если я сопоставлю имя таблицы с владельцем базы данных, я получу свой выбор.

Например, User_1.Items предоставляется SELECT для User_2. Если я тогда запрашиваю SELECT * FROM ITEMS, я получаю ошибку.

Однако, если я попытаюсь SELECT * FROM USER_1.ITEMS, у меня все получится. Это так и должно быть? Я думал, что префикс User_1 подразумевается грантом.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Да, так и должно быть. Предположим, что USER_3 также сделал GRANT SELECT ON USER3.ITEMS TO USER_2. Чей бы стол ITEMS вы ожидали бы USER_2, чтобы посмотреть, сможет ли он просто запустить SELECT * FROM ITEMS? Это было бы неоднозначно.

Чтобы предотвратить такую ​​неоднозначность, когда USER_2 делает SELECT ... FROM TABLE, Oracle использовал таблицу как пространство имен USER_2.

Если вы хотите, чтобы ITEMS в пространстве имен USER_2 указывало на USER_1.ITEMS, вам нужен синоним, например:

CREATE OR REPLACE SYNONYM USER_2.ITEMS FOR USER_1.ITEMS;

Теперь USER_2 может работать

SELECT * FROM ITEMS

И он вернет данные из таблицы USER_1.ITEMS.

P.S. Если вы хотите предоставить кому-либо доступ к таблице только для чтения, вам следует предоставить привилегию READ вместо привилегии SELECT. Привилегия SELECT включает возможность SELECT..FOR UPDATE, создающую блокировки ваших данных, потенциально нарушающую работу пользователей, которым разрешено выполнять запись в таблицу.

0 голосов
/ 18 сентября 2018

Если вы не определите имя таблицы (при входе в систему как USER_2), единственные таблицы, к которым вы (идеализированное «вы» здесь!) Можете получить, - это таблицы в схеме USER_2, или таблицы, для которых кто-то создал синоним ,

Так и должно быть. Предоставление позволяет USER_2 получить доступ к таблице, но не создает синоним (см. Концепцию в документации). Подумайте об этом: USER_4 и USER_5 могут иметь таблицы (в своих собственных схемах) с именем TBL; они оба могут предоставить доступ к USER_2. Итак, когда USER_2 ссылается на "TBL" без квалификации, какая таблица действительно имеет в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...