首页 文章

PL / SQL循环撤消权限

提问于
浏览
0

我需要创建一个执行以下操作的过程:

  • 撤消直接授予用户的系统权限 . (表:dba_sys_privs)

  • 撤消直接授予用户的对象权限 . (表:dba_tab_privs)

  • 它撤消直接授予用户的角色 . (表:dba_role_privs)

它必须循环遍历表并为用户删除所有表 . 到目前为止,我有#1和#3工作 . 但我需要添加#2,我似乎无法弄清楚如何做到这一点 . 这是我的#2代码,我一直收到错误:

`//REVOKING OBJECT PRIVILEGES CREATE or REPLACE PROCEDURE deactivate_user (p_username IN VARCHAR2) AS l_username VARCHAR2(30) := UPPER(p_username); BEGIN FOR rec IN (SELECT * FROM dba_tab_privs WHERE GRANTEE = p_username) LOOP EXECUTE IMMEDIATE 'REVOKE ALL PRIVILEGES ON TABLE '||rec.owner||'.'||rec.table_name||' FROM '||rec.grantee; END LOOP; END; /`

当我尝试执行代码时:SQL> exec deactivate_user('BLAKE'),我收到此错误:错误:第1行:ORA-06550:表或视图不存在ORA-06512:at“SYS.DEACTIVATE_USER”,第7行

非常感谢您的帮助!

1 回答

  • 0

    表权限的正确命令是:

    REVOKE ALL PRIVILEGES FROM ...
    

    要么:

    REVOKE READ FROM ...
    

    而且,添加TABLE关键字也更好 .

    所以EXECUTE IMMEDIATE语句应该是:

    EXECUTE IMMEDIATE 'REVOKE ALL PRIVILEGES ON TABLE ' || rec.owner || '.' || rec.table_name ||' FROM '|| rec.grantee;
    

    要么:

    EXECUTE IMMEDIATE 'REVOKE ' || rec.privilege || ' ON TABLE ' || rec.owner || '.' || rec.table_name ||' FROM '|| rec.grantee;
    

    Update

    在我的第一个答案中,最重要的是缺少:表所有者 .

相关问题