【问题标题】:Oracle Read only access to specific userOracle 对特定用户的只读访问权限
【发布时间】:2020-10-03 18:42:27
【问题描述】:

我有一个架构和许多用户。对于开发,我想授予用户仅读取表而无权操作数据库的权限。是否有任何命令可以将特定用户的访问权限设置为只读?

【问题讨论】:

  • 您使用哪个数据库? MySQL 还是 Oracle?
  • 不,您确实没有有“一个架构和许多用户。”。用户不是 in 模式。用户拥有他们自己的架构。用户 = 所有者 = 架构。现在,对于您的问题 - 在 oracle 中,除非明确被批准,否则一切都是被禁止的。如果您希望给定用户对另一个用户的(模式)表具有只读访问权限,则不要授予该用户除 SELECT ON OTHER_USER.TABLE_NAME 之外的任何内容。我的 cmets 被定向到 oracle。由于您标记了 2 种不同的 rdbms 产品,我们不知道您真正询问的是哪一种。
  • @Littlefoot Oracle 数据库
  • @jps 不完全是兄弟
  • @Tech_Delhi:您将其标记为 mysql(以及 C#),所以当答案不符合您的需要时,请不要感到惊讶。 Oracle 的正确答案应该和 mysql 一样容易找到。

标签: oracle


【解决方案1】:

正如 Ed 所说,除非获得批准,否则您不得做任何事情。对于只读用户,您将只授予对您的表的 SELECT 权限。如果您只有几个,请手动执行。否则,请创建一个为您执行此操作的过程。这是一个例子。

这些是我的桌子:

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
LINKS                          TABLE
SALGRADE                       TABLE

循环遍历我的架构中的所有表并将SELECT 作为参数传递给用户的过程:

SQL> create or replace procedure p_grant_ro(par_user in varchar2) is
  2    l_str varchar2(200);
  3  begin
  4    for cur_r in (select table_name from user_tables
  5                  order by table_name
  6                 )
  7    loop
  8      l_str := 'grant select on ' || cur_r.table_name ||
  9               ' to ' || dbms_assert.schema_name(par_user);
 10      dbms_output.put_line(l_str);
 11      execute immediate(l_str);
 12    end loop;
 13  end;
 14  /

Procedure created.

测试:

SQL> set serveroutput on;
SQL> exec p_grant_ro('MIKE');
grant select on BONUS to MIKE
grant select on DEPT to MIKE
grant select on EMP to MIKE
grant select on LINKS to MIKE
grant select on SALGRADE to MIKE

PL/SQL procedure successfully completed.

SQL>

如果您想知道dbms_assert 函数调用的目的是什么:防止可能的 SQL 注入。函数注意参数是现有的模式名称。

SQL> exec p_grant_ro('TECH_DELHI');
BEGIN p_grant_ro('TECH_DELHI'); END;

*
ERROR at line 1:
ORA-44001: invalid schema
ORA-06512: at "SYS.DBMS_ASSERT", line 266
ORA-06512: at "SCOTT.P_GRANT_RO", line 8
ORA-06512: at line 1


SQL>

【讨论】:

    【解决方案2】:

    您应该能够在例如MYSQL 工作台。 我认为还有一种方法可以将其链接到 Apex 用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 2019-12-24
      • 1970-01-01
      • 2023-03-03
      • 2015-06-23
      • 2017-02-09
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多