Да, так и должно быть. Предположим, что 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
, создающую блокировки ваших данных, потенциально нарушающую работу пользователей, которым разрешено выполнять запись в таблицу.