0

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

  1. 撤销直接授予用户的系统权限。(表:dba_sys_privs)
  2. 撤销直接授予用户的对象权限。(表:dba_tab_privs)
  3. 它撤销直接授予用户的角色。(表: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:在“SYS.DEACTIVATE_USER”,第 7 行

非常感谢您的帮助!

4

1 回答 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;

更新

我的第一个答案中缺少最重要的东西:表所有者。

于 2013-09-22T18:01:00.823 回答