我有一个模式和一个名称相同的用户:products
。为了开发,我想从Java应用程序以只读模式使用它。因此,我为只读应用程序创建了一个新用户。
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
我的方法有什么问题吗?
--更新--
看起来在10g中删除了为模式创建同义词的功能(Oracle:是否可以为模式创建同义词?)。如果我为目标模式中的每个对象创建模式,那么每次向目标模式添加表或对目标模式中的任何其他对象进行更改时,都必须执行相同操作。这听起来很麻烦...
--更新2--
似乎使用带有alter session
的触发器是一种可能的解决方案,但它会使表只读,只要用户只具有SELECT
权限吗?
setReadOnly()
仅是驱动程序优化数据库的“提示”,而快速测试表明这并不会阻止运行DML语句。 - user330315