【问题标题】:Oracle - How to create a readonly userOracle - 如何创建只读用户
【发布时间】:2011-11-22 01:54:02
【问题描述】:

可以在 Oracle 数据库中创建只读数据库用户吗? 怎么样?

【问题讨论】:

    标签: oracle readonly


    【解决方案1】:

    Oracle 数据库中的用户仅拥有您授予的权限。因此,您只需不授予任何其他权限即可创建只读用户。

    创建用户时

    CREATE USER ro_user
     IDENTIFIED BY ro_user
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;
    

    用户甚至没有登录数据库的权限。你可以授予它

    GRANT CREATE SESSION to ro_user
    

    然后您就可以开始授予您想要的任何读取权限。例如,如果你想让RO_USER 能够查询SCHEMA_NAME.TABLE_NAME,你可以这样做

    GRANT SELECT ON schema_name.table_name TO ro_user
    

    一般来说,您最好创建一个角色,然后将对象权限授予该角色,这样您就可以将该角色授予不同的用户。类似的东西

    创建角色

    CREATE ROLE ro_role;
    

    授予角色对特定架构中每个表的 SELECT 访问权限

    BEGIN
      FOR x IN (SELECT * FROM dba_tables WHERE owner='SCHEMA_NAME')
      LOOP
        EXECUTE IMMEDIATE 'GRANT SELECT ON schema_name.' || x.table_name || 
                                      ' TO ro_role';
      END LOOP;
    END;
    

    然后将角色授予用户

    GRANT ro_role TO ro_user;
    

    【讨论】:

    • 好的,但前提是只读用户使用 schema_name。有没有办法用户可以在没有 schema_name 的情况下编写查询?
    • 回答我上面的评论:使用私有同义词。
    【解决方案2】:
    create user ro_role identified by ro_role;
    grant create session, select any table, select any dictionary to ro_role;
    

    【讨论】:

    • 将角色直接授予表是一种很好的间接方式,但对于简单的用例,这是一个更直接的答案。我还发现 oracles 的“识别者”语法让新用户感到困惑,所以我会使用这个:create user readonly_user identified by "password"; grant create session, select any table, select any dictionary to readonly_user;
    【解决方案3】:

    以用户系统为例,执行以下过程。

    将 p_owner 设置为架构所有者,将 p_readonly 设置为只读用户的名称。

    create or replace
    procedure createReadOnlyUser(p_owner in varchar2, p_readonly in varchar2) 
    AUTHID CURRENT_USER is
    BEGIN
        execute immediate 'create user '||p_readonly||' identified by '||p_readonly;
        execute immediate 'grant create session to '||p_readonly;
        execute immediate 'grant select any dictionary to '||p_readonly;
        execute immediate 'grant create synonym to '||p_readonly;
    
       FOR R IN (SELECT owner, object_name from all_objects where object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP
          execute immediate 'grant select on '||p_owner||'.'||R.object_name||' to '||p_readonly;
       END LOOP;
       FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP
          execute immediate 'grant execute on '||p_owner||'.'||R.object_name||' to '||p_readonly;
       END LOOP;
       FOR R IN (SELECT owner, object_name FROM all_objects WHERE object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP
          EXECUTE IMMEDIATE 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"';
       END LOOP;
       FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP
          execute immediate 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"';
       END LOOP;
    END;
    

    【讨论】:

      【解决方案4】:

      您可以创建用户并授予权限

      创建由 read_only 标识的用户 read_only; 授予创建会话,选择任何表为只读;

      【讨论】:

        【解决方案5】:

        由于每个用户通过公共自动获得许多公共执行,因此在默认数据库中严格来说是不可能的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-20
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2022-06-29
          相关资源
          最近更新 更多