Oracle - 如何授予一个用户访问另一个用户的对象的权限

7
我需要给用户 TARGETUSER 授予对用户 SOURCEUSER 所有表的选择/插入/更新权限(我可以从这里找到所有信息),并允许他们运行所有存储过程。
基本上,如果我能让 TARGETUSER 能够执行 SOURCE_USER 对象的所有非 DDL 活动,我就不会抱怨了。我该如何做到这一点?
2个回答

8
你可以编写一个简单的过程来实现这个功能:
BEGIN
  FOR Rec IN (SELECT object_name, object_type FROM all_objects WHERE owner='SOURCEUSER' AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP
    IF Rec.object_type IN ('TABLE','VIEW') THEN
      EXECUTE IMMEDIATE 'GRANT SELECT, UPDATE, INSERT, DELETE ON SOURCEUSER.'||Rec.object_name||' TO TARGETUSER';
    ELSIF Rec.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN
      EXECUTE IMMEDIATE 'GRANT EXECUTE ON SOURCEUSER.'||Rec.object_name||' TO TARGETUSER';
    END IF;
  END LOOP;
END;

不确定您还需要什么。您可以修改以上内容,以添加其他授权和/或对象类型,以提供给目标用户所需的权限。正如@stili所示,您可以使用角色完成很多工作,但请小心 - 某些权限授予角色时可能无法正常工作。


非常感谢,这正是我在寻找的。我稍微为您修复了语法。 - George Mauer
在查询中添加了子句以限制所需的对象类型。 - DCookie

1
生成 SQL 脚本,您可以使用以下方法,类似于 DCookie 建议的解决方案。
SELECT 'GRANT SELECT, UPDATE, DELETE, INSERT ON ' || table_name || ' TO other_user;'
      FROM all_tables WHERE owner = 'other_user';
UNION ALL
SELECT 'GRANT EXECUTE ON ' || object_name || ' TO other_user;'
    FROM all_objects 
    WHERE owner = 'other_user' 
    AND object_type IN ('FUNCTION', 'PROCEDURE', 'PACKAGE');

通常,我建议使用角色来避免为每个用户授予访问权限。
如果使用角色,请以您要复制角色的用户身份运行以下 SQL。您还可以包括其他选项,如 admin_optiondefault_role
SELECT 'GRANT ' || granted_role || ' TO other_user;'
  FROM user_role_privs;

或者,您可以查询 dba_role_privs 来获取特定用户的角色:

SELECT 'GRANT ' || granted_role || ' TO other_user;'
  FROM dba_role_privs WHERE grantee = 'source_user';

非常感谢,但源用户实际上拥有完全的 DBA 权限。我只需要访问其表格的选择/插入和执行其存储过程的权限。 - George Mauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接