【问题标题】:Grant Select on all Tables Owned By Specific User在特定用户拥有的所有表上授予选择
【发布时间】:2010-09-16 07:37:06
【问题描述】:

我需要将特定用户拥有的所有表的选择权限授予另一个用户。我可以使用单个命令执行此操作吗:

Grant Select on OwningUser.* to ReceivingUser

或者我是否必须为每个表生成 sql,其中包含以下内容:

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

【问题讨论】:

    标签: oracle


    【解决方案1】:

    嗯,这不是一个单一的声明,但它几乎是你可以使用 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; 
    

    【讨论】:

    • 还有for v in (select OWNER, VIEW_NAME from ALL_VIEWS where OWNER = 'XXX') loop
    • 只是观察到这种方法的挑战在于它是“时间点” - 任何后续添加的表都将被排除在外。如果有一个概念性的“将 someSchema 拥有的任何表的只读访问权限授予 someUser”语句会更好,因为可以保证 someSchema 拥有的任何表都可以被 someUser 读取
    • 即使我尝试“SELECT owner, table_name FROM all_tables WHERE owner='TheOwner'”,这也会以错误“表或视图不存在”结尾——它给了我一行,所以选择没问题,但整个循环以提到的错误结束。
    • @klara,您可能没有权限授予查询返回的表的权限。
    【解决方案2】:

    是的,有可能,运行这个命令:

    假设您的用户名为 thoko

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

    注意:在 oracle 数据库上工作

    【讨论】:

    • 这将在所有模式上授予它,并且需要系统权限才能授予它
    【解决方案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;
    /
    

    【讨论】:

      【解决方案4】:

      来自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;
      

      【讨论】:

        猜你喜欢
        • 2022-08-14
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 2021-12-19
        • 2015-11-25
        相关资源
        最近更新 更多