授予对现有 Oracle 模式的只读访问权限

And*_*rew 3 oracle oracle-11g

我们有一个 Oracle 11g Schema,我们的应用程序使用它来选择、插入和更新,但是我们的一位客户要求提供对应用程序拥有的相同基表和视图的只读访问。

除了将所有应用程序拥有的表同义词放入一个新帐户(或将同义词设为公开)之外,我将如何执行此操作?

对我应该查看的方法或 Oracle 功能的任何帮助或指示将不胜感激,谢谢!

小智 8

您需要一个单独的帐户来授予只读访问权限。我建议添加一个您也授予只读访问权限的角色 - 如果将来有更多用户需要此访问权限,您可以重新使用该角色。

CREATE ROLE my_read_only_role;

BEGIN
  FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
  END LOOP;
  FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
  END LOOP;
END;
/

GRANT my_read_only_role TO new_customer_account;
Run Code Online (Sandbox Code Playgroud)

完成后,新帐户需要在表名前加上架构名来选择数据。或者,您可以为每个对象创建公共同义词(您可以向上面代码中的每个循环添加另一个 EXECUTE IMMEDIATE)。或者你可以让用户运行命令

ALTER SESSION SET current_schema = <<schema name>>
Run Code Online (Sandbox Code Playgroud)

登录时。您还可以在新帐户中创建一个登录触发器来自动执行此操作。这将导致<<schema name>>隐式添加为架构前缀。它不影响会话的权限——用户仍然具有只读权限,默认模式名称刚刚更改。