【发布时间】:2014-03-09 11:58:54
【问题描述】:
我有一个架构和一个同名用户: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: is it possible to create a synonym for a schema?) 中删除了为模式创建同义词。如果我为目标架构中的每个对象创建架构,每次将表添加到目标架构或对目标架构中的任何其他对象进行任何其他更改时,我都必须这样做?听起来很麻烦……
--更新 2--
似乎带有alter session 的触发器是一种可能的解决方案,但是只要用户只有SELECT 权限,它就会使表成为只读吗?
【问题讨论】:
-
为什么不获取到数据库的只读连接? (Connection.setReadOnly(true);)
-
我不想碰 Java 应用程序。我们有几个带有框架的层,我们不明确使用连接。我会避免这样做,我想知道是否可以在数据库级别实现。
-
@wumpz:根据 JavaDocs,
setReadOnly()只是驱动程序“启用数据库优化”的提示,快速测试显示这不会阻止运行 DML 语句。 -
@a_horse_with_no_name 你能用详细的触发器描述/代码创建一个答案吗?谢谢。