【问题标题】:Restrict DROP and ALTER table under specific schema in Oracle在 Oracle 的特定模式下限制 DROP 和 ALTER 表
【发布时间】:2018-06-07 20:07:21
【问题描述】:

我创建了一个用户(比如 DROP_PARTITION_USER)来删除表的分区。该表由不同的用户拥有(比如 NORMAL_USER)。 目前,我已将 DROP ANY TABLEALTER ANY TABLE 权限授予 DROP_PARTITION_USER。当 DROP_PARTITION_USER 执行以下语句时,它会成功执行。

ALTER TABLE SCHEMANAME.TABLENAME DROP PARTITION <PARTITION_NAME> UPDATE GLOBAL INDEXES;

但是,DROP ANY TABLEALTER ANY TABLE 允许 DROP_PARTITION_USER 删除和更改任何架构下的任何表 [https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9013.htm]。 Oracle 有什么方法可以限制特定模式下的 drop 和 alter table?

【问题讨论】:

  • 为什么 NORMAL_USER 不维护自己的表(包括删除分区)?

标签: oracle


【解决方案1】:

解决此问题的常用方法是创建一个由 NORMAL_USER 拥有的过程来删除其中一个表的分区之一。

然后你GRANT EXECUTE这个过程到DROP_PARTITION_USER。

您不需要额外的权限。

CREATE OR REPLACE PROCEDURE my_drop_partition (p_table_name VARCHAR2, p_partition_name VARCHAR2) 
IS
BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE '||p_table_name||' DROP PARTITION '||p_partition_name;
END my_drop_partition;
/


GRANT EXECUTE ON my_drop_partition TO drop_partition_user;

【讨论】:

  • 那么即使 DROP_PARTITION_USER 没有 DROP ANY TABLE 和 ALTER ANY TABLE 权限,是否能够成功执行存储过程?
  • 是的,没错,这就是 Oracle 中的标准权限模型。所有者被允许在其自己的表上进行所有操作,并且该过程实际上由所有者执行。如果所有者选择授予其他人执行程序的权利,那绝对可以。甚至名称解析也是如此,因此您不需要过程中表的模式名称。
【解决方案2】:

您可以使用 DDL 触发器来捕获此类尝试并采取您喜欢的任何操作。例如

SQL> CREATE OR REPLACE TRIGGER STOP_THAT_STUFF
  2  before create or alter or drop on database
  3  begin
  4    if ora_dict_obj_owner in ('SCOTT') and
  5       ora_sysevent in ('DROP','ALTER') and
  6       ora_dict_obj_name = 'MY_TABLE'
  7    then
  8      raise_application_error(-20000,'What the hell are you thinking!!!!');
  9    end if;
 10  end;
 11  /

Trigger created.

SQL>
SQL> conn scott/tiger
Connected.

SQL> create table scott.my_table(x int );

Table created.

SQL> create table scott.my_other_table(x int);

Table created.

SQL> drop table my_other_table;

Table dropped.

SQL> drop table my_table;
drop table my_table
*
ERROR at line 1:
ORA-04088: error during execution of trigger 'SYS.STOP_THAT_STUFF'
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: What the hell are you thinking!!!!
ORA-06512: at line 6


SQL> desc my_table
 Name                                                                    Null?    Type
 ----------------------------------------------------------------------- -------- ----------------
 X                                                                                NUMBER(38)

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2014-05-03
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多