Ограничить таблицу DROP и ALTER для определенной схемы в Oracle - PullRequest
0 голосов
/ 07 июня 2018

Я создал пользователя (скажем, DROP_PARTITION_USER) для удаления разделов таблицы.Таблица принадлежит другому пользователю (скажем, NORMAL_USER).В настоящее время я предоставил привилегии DROP ANY TABLE и ALTER ANY TABLE для DROP_PARTITION_USER.Когда DROP_PARTITION_USER выполняет следующий оператор, он выполняется успешно.

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

Но, DROP ANY TABLE и ALTER ANY TABLE позволяет DROP_PARTITION_USER удалять и изменять любую таблицу в любой схеме [https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9013.htm].Есть ли способ в Oracle, чтобы ограничить удаление и изменение таблицы в рамках конкретной схемы?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы можете использовать триггер 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)
0 голосов
/ 07 июня 2018

Обычный способ решить эту проблему - создать процедуру, принадлежащую 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...