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

我们已经有了一个Oracle 11g架构,我们的应用程序用它来select,插入和更新,但是我们有一个来自我们的客户的请求,提供对应用程序拥有的相同基表和视图的只读访问。

除了将所有应用程序拥有的表格同名到一个新帐户(或公开同义词)之外,我将如何去做这件事?

任何帮助或指针的方法或甲骨文function,我应该看看将不胜感激,谢谢!

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

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; 

一旦完成,新帐户将需要在表名称前加上模式名称来select数据。 或者,您可以为每个对象创build公共同义词(您可以在上面的代码中为每个循环添加另一个EXECUTE IMMEDIATE)。 或者你可以让用户运行命令

 ALTER SESSION SET current_schema = <<schema name>> 

在login。 您也可以在新帐户中自动创build一个login触发器。 这将导致<<schema name>>被隐式添加为模式前缀。 它不会影响会话的权限 – 用户仍然具有只读权限,默认模式名称刚刚被更改。

我创build了不带配额的new_customer_account as sysdba:

 create user new_customer_account IDENTIFIED BY new_password DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TMP PROFILE DEFAULT ACCOUNT UNLOCK; GRANT CONNECT TO new_customer_account; GRANT CREATE SESSION TO new_customer_account; ALTER USER new_customer_account QUOTA 0 ON users; 

application_user在相关视图(和/或表)上授予select权:

 BEGIN FOR i IN (SELECT * FROM all_views WHERE owner = '' AND relevant_where_clause) LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON application_user.' || i.view_name || ' TO new_customer_account'; END LOOP; END; 

之后,new_customer_account创build新的同义词:

 BEGIN FOR i IN (SELECT * FROM all_views WHERE owner = 'application_user' AND relevant_where_clause) LOOP EXECUTE IMMEDIATE 'CREATE SYNONYM ' || i.view_name || ' FOR application_user.' || i.view_name; END LOOP; END; 

我很确定,你必须创build一个新的帐户,并只授予select该用户。