У меня есть схема и пользователь с таким же именем: products
. Для разработки я хотел бы использовать его в режиме только для чтения из приложения Java. Поэтому я создал нового пользователя для приложения только для чтения.Oracle: доступ только для чтения к схеме для другого пользователя?
CREATE USER PRODUCTS_READONLY IDENTIFIED BY PRODUCTS_READONLY;
GRANT CREATE SESSION to PRODUCTS_READONLY;
BEGIN
FOR tab IN (SELECT table_name FROM all_tables WHERE owner = 'PRODUCTS') LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON PRODUCTS.'||tab.table_name||' TO PRODUCTS_READONLY';
END LOOP;
END;
Запуск приложения У меня ошибка, что таблица не существует. Поиск в Интернете для решения, я наткнулся SYNONYM
. Поэтому я добавил синоним к схеме:
CREATE SYNONYM PRODUCTS_READONLY FOR PRODUCTS;
Теперь я получаю эту ошибку в моем java
применения:
ERROR org.hibernate.util.JDBCExceptionReporter - ORA-17074 invalid name pattern.: PRODUCTS_READONLY.PRODUCT_TYPE
Что не так с моим подходом?
--UPDATE--
Кажется, создавая синонимы к схеме была удалена в 10г (Oracle: is it possible to create a synonym for a schema?). Если я создам схему для каждого объекта в целевой схеме, мне придется делать то же самое каждый раз, когда таблица добавляется в целевую схему или любые другие изменения в любые другие объекты в целевой схеме? Это звучит громоздко ...
--update 2--
Похоже, триггер с alter session
является возможным решением, но он будет делать таблицы только для чтения, пока пользователь имеет только SELECT
привилегии ?
Почему бы не получить только чтение Подключение к вашей базе данных? (Подключение.setReadOnly (true);) – wumpz
Я бы не касался приложения Java. У нас есть несколько уровней с фреймворками, и мы не используем связи явно. Я бы этого не делал, и мне интересно, можно ли достичь уровня базы данных. – user3111525
@wumpz: В соответствии с JavaDocs 'setReadOnly()' - это всего лишь * подсказка * для драйвера для «* включения оптимизации базы данных *», а быстрый тест показывает, что это не мешает выполнению операторов DML. –