我们有一个 Oracle 11g 模式,我们的应用程序使用它来选择、插入和更新,但我们的一位客户要求我们提供对应用程序拥有的相同基表和视图的只读访问权限。
除了将所有应用程序拥有的表同义词化为新帐户(或将同义词公开)之外,我该如何做呢?
如能得到任何有关我应该研究的方法或 Oracle 特性的帮助或指点,我将不胜感激,谢谢!
答案1
您需要一个单独的帐户来授予只读访问权限。我建议添加一个您也授予只读访问权限的角色——如果将来有更多用户需要此访问权限,您可以重新使用该角色。
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;
完成此操作后,新帐户需要在表名前加上架构名称以选择数据。或者,您可以为每个对象创建公共同义词(您可以在上述代码中的每个循环中添加另一个 EXECUTE IMMEDIATE)。或者,您可以让用户运行命令
ALTER SESSION SET current_schema = <<schema name>>
登录时。您还可以在新帐户中创建一个登录触发器,该触发器会自动执行此操作。这将导致<<schema name>>
隐式添加为架构前缀。它不会影响会话的权限——用户仍然具有只读权限,默认架构名称刚刚被更改。
答案2
我以 sysdba 身份创建了没有配额的 new_customer_account:
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 授予了相关视图(和/或表)的选择权限:
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 创建新的同义词:
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;
答案3
我很确定您必须创建一个新帐户,并且只向该用户授予选择权。