Oracle: Как вы можете очистить каждый грант, который имеет пользователь? - PullRequest
0 голосов
/ 14 октября 2019

Я ищу быстрый и простой способ отменить каждую привилегию пользователя на таблицы, представления и т. Д. Есть ли какая-нибудь простая магия, которая может это сделать?

Цель этого - запуститьсвежие на то, что доступ должен иметь.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Я продолжал думать, что была какая-то команда 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 просто потому, что вам нужно иметь запись о том, какие привилегии вы отменили, а также, чтобы остановить вас от случайной отмены авторизации чего-либо или кого-то, кто может вернуться, чтобы укусить вас позже.

Фактически, вместо отмены всех привилегий и повторного предоставления некоторых из них было бы лучше увидеть все привилегии, которыми обладает пользователь, и просто отозвать те, которые не должны были быть предоставлены.

0 голосов
/ 14 октября 2019

Когда вы узнаете, какие привилегии имеет пользователь, например,

SQL> select * From user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          CREATE DATABASE LINK                     NO
SCOTT                          CREATE ROLE                              NO
SCOTT                          CREATE VIEW                              NO
SCOTT                          CREATE TYPE                              NO
SCOTT                          CREATE PROCEDURE                         NO
SCOTT                          UNLIMITED TABLESPACE                     NO
SCOTT                          CREATE PUBLIC SYNONYM                    NO
SCOTT                          CREATE TABLE                             NO
SCOTT                          CREATE TRIGGER                           NO
SCOTT                          CREATE SEQUENCE                          NO
SCOTT                          CREATE SESSION                           NO

11 rows selected.

SQL>

, напишите запрос, который напишет для вас некоторый код:

SQL> select 'revoke ' || privilege || ' from scott;'
  2  from user_sys_privs;

'REVOKE'||PRIVILEGE||'FROMSCOTT;'
--------------------------------------------------------
revoke CREATE DATABASE LINK from scott;
revoke CREATE VIEW from scott;
revoke CREATE ROLE from scott;
revoke UNLIMITED TABLESPACE from scott;
revoke CREATE PROCEDURE from scott;
revoke CREATE TYPE from scott;
revoke CREATE PUBLIC SYNONYM from scott;
revoke CREATE TABLE from scott;
revoke CREATE TRIGGER from scott;
revoke CREATE SESSION from scott;
revoke CREATE SEQUENCE from scott;

11 rows selected.

SQL>

Теперь скопируйте / вставьте эти revokeзаявления и запустить их.


Однако это еще не все. Пользователь может иметь дополнительные привилегии, поэтому - как привилегированный пользователь - запросите DBA_SYS_PRIVS, DBA_ROLE_PRIVS, DBA_TAB_PRIVS.

Чтобы не слишком много думать :), посмотрите, как Пит Финниган сделал это. Скрипт датируется 2003 годом, но - он даст вам представление о том, как это сделать.


Кроме того, возможно, самый простой способ сделать это - удалить этого пользователя (но это, я полагаю, невариант).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...