Oracle Database Script для удаления пользователей с определенной ролью - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь написать сценарий для своей базы данных Oracle 12C, который позволил бы мне УБРАТЬ всех пользователей определенной роли, но, похоже, не мог понять это правильно.

declare
    cursor ID_CURSOR is 
        SELECT USERNAME
            from all_users;
        WHERE granted_role = 'STUDENT'
begin
    for REC in ID_CURSOR loop
        'DROP USER REC CASCADE';
    end loop;
end;
/

Ответы [ 2 ]

0 голосов
/ 23 января 2019

В ответ на ответ Марка - самый простой способ - просто запустить этот скрипт, скопировать и вставить вывод, а затем запустить его.

select 'drop user ' || grantee || ' cascade;' as script
from dba_role_privs 
where granted_role = 'STUDENT';

Если вы действительно хотите использовать PL / SQL, вам придется сделать это следующим образом. Я использовал неявный цикл курсора, потому что его проще и короче набирать.

begin
    for REC in (select grantee from dba_role_privs where granted_role = 'STUDENT')
    loop
        execute immediate 'drop user ' || REC.grantee || ' cascade';
    end loop;
end;
/
0 голосов
/ 23 января 2019

Ну ваша строка темы и ваш примерный курсор не совпадают с началом. Также вы не можете выпускать DDL из PL / SQL. Вы должны использовать выполнить немедленно. Смотрите руководство по PL / SQL. - - Таким образом, чтобы найти пользователей, которым назначена определенная роль, вы можете использовать

select grantee from dba_role_privs where granted_role='ROLE_NAME'

и в курсоре вы используете что-то вроде

 execute immediate 'drop user '||rec.username||' cascade;';    

однако зачем использовать PL / SQL для этого? Если это одноразовое усилие, тогда просто используйте SQL для генерации операторов отбрасывания, спулингируйте результат, отредактируйте, чтобы установить параметры SQLPlus, такие как «set echo on», затем запустите сгенерированный скрипт? - - Марк Д Пауэлл -

...