授予特定用户所有表的选择权限。

45
我需要将特定用户拥有的所有表格的select权限授权给另一个用户。我可以使用类似以下命令的单个命令来完成吗?
Grant Select on OwningUser.* to ReceivingUser

还是说我需要使用类似以下的方式为每个表生成SQL:

 Select 'GRANT SELECT ON OwningUser.'||Table_Name||'TO ReceivingUser' 
 From All_Tables Where Owner='OWNINGUSER'
5个回答

70

虽然不是单个语句,但这几乎是你在Oracle中能够得到的最接近的东西:

BEGIN
   FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner='TheOwner') LOOP
      EXECUTE IMMEDIATE 'grant select on '||R.owner||'.'||R.table_name||' to TheUser';
   END LOOP;
END; 

4
也就是说,对于所有属主为 'XXX' 的视图,对其名称进行循环遍历:for v in (select OWNER, VIEW_NAME from ALL_VIEWS where OWNER = 'XXX') loop - gavenkoa
3
仅仅是一种观察,这种方法的挑战在于它是“瞬时”的——任何后续添加的表都将被排除。最好的方式是拥有一个概念性的“将某个模式下所有表的只读权限授予某个用户”的语句,这样可以确保某个模式下的所有表都可以被某个用户读取。 - Pancho
即使我尝试“SELECT owner, table_name FROM all_tables WHERE owner='TheOwner'”,它仍以错误“表或视图不存在”结束 - 它给了我一些行,所以选择是正确的,但整个循环以提到的错误结束。 - Klára Janstová
@klara,你可能没有权限授予查询返回的表的特权。 - DCookie

3

是的,这是可能的。运行以下命令:

假设你有一个名为thoko的用户。

grant select any table, insert any table, delete any table, update any table to thoko;

注意:曾在Oracle数据库上工作


5
这将在所有模式中授予它,并需要系统特权才能授予此权限。 - Petr

3
SET SERVEROUT ON
DECLARE
  o_type VARCHAR2(60) := '';
  o_name VARCHAR2(60) := '';
  o_owner VARCHAR2(60) := '';
  l_error_message VARCHAR2(500) := '';
BEGIN
  FOR R IN (SELECT owner, object_type, object_name
            FROM all_objects 
            WHERE owner='SCHEMANAME'
            AND object_type IN ('TABLE','VIEW')
            ORDER BY 1,2,3) LOOP
    BEGIN
    o_type := r.object_type;
    o_owner := r.owner;
    o_name := r.object_name;
    DBMS_OUTPUT.PUT_LINE(o_type||' '||o_owner||'.'||o_name);
    EXECUTE IMMEDIATE 'grant select on '||o_owner||'.'||o_name||' to USERNAME';
    EXCEPTION
      WHEN OTHERS THEN
        l_error_message := sqlerrm;
        DBMS_OUTPUT.PUT_LINE('Error with '||o_type||' '||o_owner||'.'||o_name||': '|| l_error_message);
        CONTINUE;
    END;
  END LOOP;
END;
/

0
http://psoug.org/reference/roles.html中,为您的用户在数据库上创建一个过程来完成它。
CREATE OR REPLACE PROCEDURE GRANT_SELECT(to_user in varchar2) AS

  CURSOR ut_cur IS SELECT table_name FROM user_tables;

  RetVal  NUMBER;
  sCursor INT;
  sqlstr  VARCHAR2(250);

BEGIN
    FOR ut_rec IN ut_cur
    LOOP
      sqlstr := 'GRANT SELECT ON '|| ut_rec.table_name || ' TO ' || to_user;
      sCursor := dbms_sql.open_cursor;
      dbms_sql.parse(sCursor,sqlstr, dbms_sql.native);
      RetVal := dbms_sql.execute(sCursor);
      dbms_sql.close_cursor(sCursor);

    END LOOP;
END grant_select;

0
DECLARE
    v_owner VARCHAR2(50) DEFAULT 'TEST1';
    v_grantee VARCHAR2(50) DEFAULT 'TEST2';
BEGIN
    FOR c IN (SELECT object_name FROM all_objects WHERE owner = v_owner and object_type = 'TABLE')
    LOOP
        BEGIN
            EXECUTE IMMEDIATE 'GRANT SELECT ON ' || v_owner || '.' || c.object_name||' TO ' || v_grantee;
        EXCEPTION when OTHERS THEN
            DBMS_OUTPUT.PUT_LINE (c.object_name);
        END;
    END LOOP;
END;
/

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