有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Oracle:另一个用户对模式的只读访问?

我有一个模式和一个同名的用户: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权限


共 (1) 个答案

  1. # 1 楼答案

    我不确定你能否为schema创建一个同义词

    但是可以为远程模式中的每个对象创建同义词,例如

    begin
      for c in (select t.table_name from table_privileges t where grantee = 'PRODUCTS_READONLY') loop
        execute immediate 'create synonym '||c.table_name||' for PRODUCTS.'||c.table_name;
      end loop;
    end;
    

    不要与table_name混淆,它处理所有类型的对象