Я продолжал думать, что была какая-то команда REVOKE ALL
Увы, нет. Привилегии аннулируются (и предоставляются) атомарно, как и должно быть. Желание отозвать все привилегии у пользователя - это продукт того же мышления, что в первую очередь приводит к предоставлению слишком многих и / или слишком мощных привилегий.
Существует три класса предоставленных привилегий:
- роль
- система (CREATE TABLE, CREATE SESSION и т. Д.)
- доступ к объекту (таблицы, представления, процедуры и т. д. в других схемах)
Каждый имеет свой набор представлений для словаря данных.
- USER_ROLE_PRIVS (также ALL_, DBA_)
- USER_SYS_PRIVS (также ALL_, DBA_)
- USER_TABLE_PRIVS (также ALL_, DBA_)
Мы можем использовать эти представления для генерации операторов REVOKE. Кажется странным делать это как рассматриваемый пользователь. Таким образом, опытный пользователь (то есть администратор БД) выполнит что-то вроде этого:
begin
dbms_output.put_line('Revoking granted roles ...');
for r in ( select * from dba_role_privs
where grantee = 'JOESOAP' )
loop
dbms_output.put_line('revoke ' || r.granted_role ||' from ' || r.grantee ||';');
end loop;
dbms_output.put_line('Revoking granted system privileges ...');
for r in ( select * from dba_sys_privs
where grantee = 'JOESOAP' )
loop
dbms_output.put_line('revoke ' || r.privilege ||' from ' || r.grantee ||';');
end loop;
dbms_output.put_line('granted access privileges ...');
for r in ( select * from dba_tab_privs
where grantee = 'JOESOAP' )
loop
dbms_output.put_line('revoke ' || r.privilege || ' on ' || r.owner||'.'||r.table_name ||' from ' || r.grantee ||';');
end loop;
end;
/
Это выведет команды на экран - используйте IDE, например, SQL Developer, чтобы сделать это менее сложным - что вы можете просмотрите и сохраните как исполняемый скрипт. Я предлагаю вам сделать это вместо того, чтобы иметь циклы EXECUTE IMMEDIATE просто потому, что вам нужно иметь запись о том, какие привилегии вы отменили, а также, чтобы остановить вас от случайной отмены авторизации чего-либо или кого-то, кто может вернуться, чтобы укусить вас позже.
Фактически, вместо отмены всех привилегий и повторного предоставления некоторых из них было бы лучше увидеть все привилегии, которыми обладает пользователь, и просто отозвать те, которые не должны были быть предоставлены.