УДАЛИТЕ ЛЮБУЮ ТАБЛИЦУ ДЛЯ TEST_USER_ROLE (кроме одной таблицы?)

#oracle #oracle11g #oracle10g

Вопрос:

Есть ли возможность отменить привилегию «удалить» из одной таблицы вместо привилегии «любая таблица»?

У моей роли пользователя есть GRANT DELETE ANY TABLE TO TEST_USER_ROLE привилегия.

Я хотел бы оставить его, кроме одного стола.

Я попытался, REVOKE DELETE on TEST_TABLE from TEST_USER_ROLE но получил ошибку «не могу отозвать привилегии, которые вы не предоставляли», которая является правильной. Есть какие-нибудь советы?

Спасибо!

Комментарии:

1. Не было бы безопаснее отозвать ЛЮБУЮ привилегию и явно предоставить удаление для определенных таблиц (в определенной схеме, конечно)? Вы можете сгенерировать инструкции для этого из словаря данных, если проблема заключается в том, чтобы найти и ввести их все…

Ответ №1:

Отозвать DELETE ANY TABLE и предоставить DELETE , отдельно. Много грантов? Конечно, но вам не нужно делать это вручную — напишите запрос, который создаст эти инструкции для вас. Или сделайте это в процедуре PL/SQL, в цикле (опустите таблицу, которую вы не хотите включать).

Скажите, нужна ли вам помощь в составлении такого кода.


Вот процедура 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 цикл курсора: например, я опущу таблицу dept и (чтобы сделать список короче) предоставлю delete только 5 таблиц
  • строка № 11: составьте grant заявление
  • строка № 12: покажите это (чтобы у вас были доказательства того, что вы сделали)
  • строка № 13: грант!

Если включено больше владельцев, вы бы использовали ALL_TABLES или даже DBA_TABLES вместо USER_TABLES (строка № 6) и включили OWNER столбец (потому что у многих пользователей может быть таблица с тем же именем).

Комментарии:

1. Звучит неплохо, но у меня более 500 столов. Мне нужна помощь в составлении такого кода:)

2. Я добавил пример; взгляните.