删除任何 TABLE 到 TEST_USER_ROLE(除了一个 table?)

DELETE ANY TABLE TO TEST_USER_ROLE (except one table?)

是否有可能撤销一个 table 对“任何 table”权限的“删除”?

我的 user_role 有 GRANT DELETE ANY TABLE TO TEST_USER_ROLE 权限。

除了一个 table。

我想保留它

我尝试使用 REVOKE DELETE on TEST_TABLE from TEST_USER_ROLE,但出现“无法撤销您未授予的权限”错误,这是正确的。有什么建议吗?

谢谢!

分别撤销 DELETE ANY TABLE 和授予 DELETE。补贴多吗?当然可以,但您不必手动执行 - 编写将为您创建这些语句的查询。或者,在 PL/SQL 过程中循环执行(省略 table 你不想包含的内容)。

如果您在编写此类代码时需要帮助,请说明。


这里有一个 PL/SQL 程序可以完成这项工作:

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_grantee varchar2(30) := 'MIKE';
  3    l_str     varchar2(200);
  4  begin
  5    for cur_r in (select table_name
  6                  from user_tables
  7                  where table_name <> 'DEPT'
  8                    and rownum <= 5
  9                 )
 10    loop
 11      l_str := 'grant delete on ' || cur_r.table_name || ' to ' || l_grantee;
 12      dbms_output.put_line(l_str);
 13      execute immediate l_str;
 14    end loop;
 15  end;
 16  /
grant delete on DPT to MIKE
grant delete on TABLE_B to MIKE
grant delete on TABLE_A to MIKE
grant delete on EMPLOYEES to MIKE
grant delete on TABLE_NAME to MIKE

PL/SQL procedure successfully completed.

SQL>

。它有什么作用?

  • 第 2 行,l_grantee:我将授予权限的用户
  • 游标 FOR 循环:举个例子,我将省略 table dept 并且(为了缩短列表)grant delete for only 5 tables
  • 第 11 行:编写 grant 语句
  • 第 12 行:显示它(这样您就有证据证明您做了什么)
  • 第 13 行:授予!

如果包含更多所有者,您将使用 ALL_TABLES 甚至 DBA_TABLES 而不是 USER_TABLES(第 6 行)并包含 OWNER 列(因为许多用户可以有一个 table 同名)。