#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. Я добавил пример; взгляните.