当前位置: 首页 > 面试题库 >

Oracle:其他用户对模式的只读访问权限?

郏兴贤
2023-03-14
问题内容

我有一个架构和一个具有相同名称的用户: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–

似乎有一个触发器with alter session是一个可能的解决方案,但是只要用户只有SELECT特权,它会使表变成只读吗?


问题答案:

如果您可以控制应用程序的连接方式(例如,连接池的初始化语句),则只需运行:

ALTER SESSION SET CURRENT_SCHEMA = PRODUCTS;

从那时起(在会话的生存期内),将在PRODUCTS模式中搜索任何不合格的对象名称。

授予的所有补助金PRODUCTS_READONLY将生效。该会话将在用于登录的原始用户的凭据(和安全限制)下运行。

如果您无法更改建立或初始化连接的方式,则登录触发器也应完成以下操作:

create or replace trigger logon_trg
  after logon on database
begin
    if (user = 'PRODUCTS_READONLY') then
      execute immediate 'alter session set current_schema = products';
    end if;
exception
  when others then null; -- prevent a login failure due to an exception
end logon_trg;
/

请注意,捕获 任何 异常至关重要,因为否则执行的SQL中潜在的错误将有效地使所有人退出数据库。因此,在投入生产之前请谨慎使用并进行良好的测试。



 类似资料:
  • 主从复制架构下,默认Slave是只读的,如果写入则会报错: 127.0.0.1:6379> set foo bar (error) READONLY You can't write against a read only slave. 注意这个行为是可以修改的,虽然这样的修改没有意义: 127.0.0.1:6379> CONFIG SET slave-read-only no OK 127.0.0

  • 正在从其他模式访问表数据,并在oracle过程中插入到当前模式表中,但无法编译过程获得错误错误(5,27): PL/SQL: ORA-00942:表或视图不存在。 但当我直接从表中选择数据(在其他模式中)时,我能够获取数据,但不能在过程中获取数据。我也拥有所有必需的权限。 以下是程序。

  • 问题内容: 我最近拾起Java并遇到了问题。我有几个具有不同类的文件,但是我无法弄清楚如何访问文件中声明了其他类之外的其他类的对象。例如: 我不确定如何从其他文件和类本身有效访问其他类的这些对象?我知道我可以使对象静态化,然后通过它们所在的类将它们作为变量进行访问,但这似乎有点违反直觉?我来自面向对象较少的编程背景,因此我仍在尝试了解Java的编程风格。 问题答案: 您可能只想要这样的东西: 希望

  • 我正在用angular和nodejs创建一个应用程序,我需要能够读取另一个用户的事件列表。现在,我正在尝试使用“https://graph . Microsoft . com/v 1.0/users/other username @ company URL . com/events”,这给了我403“访问被拒绝。请检查凭据,然后重试。。然而,如果我使用“https://graph . Micros

  • 我正在构建一个使用Microsoft Graph的本机应用程序。 我正在使用OAuth2授权工作流获取授权代码:https://login.microsoftonline.com/common/OAuth2/authorize?resource=https://graph.microsoft.com&prompt=admin_contority

  • 我想注册一个应用程序在Azure有能力访问其他Azure用户的监控数据。 我知道你可以注册一个新的应用程序...https://docs.microsoft.com/en-us/Azure/active-directory/develope/quickstart-register-app