2015-11-06 2 views
0

Я имею немного странный вопрос, когда речь идет о роли оракула и моя схема кода создания, я сделаю все возможное, чтобы описать мою проблему ниже:Проблем с пользователем системы оракула доступа/ролей и разрешения

On схема создания роли создается с использованием предоставленного имени схемы.

EXECUTE IMMEDIATE 'CREATE ROLE ' || USER || 'ADMIN_R'; 

Эта роль затем предоставляется конкретным пользователям, связанным с этой схемой.

DECLARE 
    V_ROLE_NAME  CONSTANT VARCHAR2(30) := USER || 'ADMIN_R'; 
    CURSOR C_ADMIN_USERS IS 
     SELECT USERNAME FROM DBUSERS WHERE ROLE = 'ADMINISTRATION'; 
BEGIN 
    FOR REC IN C_ADMIN_USERS 
    LOOP 
     EXECUTE IMMEDIATE 'GRANT ' || V_ROLE_NAME || ' TO ' || REC.USERNAME || ' WITH ADMIN OPTION'; 
    END LOOP; 
END; 

Пользователи, имеющие эту роль, имеют доступ к специальному пакету администрирования.

EXECUTE IMMEDIATE 'GRANT EXECUTE ON P_ADMINISTRATION TO ' || USER || 'ADMIN_R'; 

Проблема заключается Когда я бросаю схему он не падает эту роль (принадлежит к оракулу), поэтому, когда я воссоздать эту схему всего процесс не потому, что эта роль уже существует. Я также не могу предоставить доступ к этой роли без входа в систему пользователей, которых я хочу избежать. Простое решение состоит в том, чтобы просто отказаться от него, но моя озабоченность в этом случае заключается в том, что администратор базы данных использует эту роль для предоставления доступа к дополнительным пользователям и потенциально дополнительным пакетам, которые будут потеряны, если мы просто произвольно отбросим эту роль для воссоздания Это.

Любая помощь будет принята с благодарностью.

ответ

0

Вы могли бы окружить ваша роль создать что-то вроде этого:

SELECT COUNT(*) 
INTO v_count 
FROM DBA_ROLES 
WHERE ROLE = USER || 'ADMIN_R'; 

IF v_count = 0 THEN 
--grant your roles 
END IF; 

Вы можете предоставить такую ​​же привилегию, как столько раз, сколько вам нравится.

+0

Я не могу предоставить эту роль с помощью зарегистрированного пользователя, хотя , Я должен будет использовать пользователя системы, чтобы предоставить ему схему в этом случае. Кого я хочу избежать. –

0

вы можете отбросить роль, прежде чем создавать

declare 
    i int; 
begin 
    select count(*) into i 
    from dba_roles where role = USER||'ADMIN_R'; 

    if (0 != i) then 
    execute immediate 'drop role '||USER||'ADMIN_R'; 
    dbms_output.put_line('Role ' ||USER||'ADMIN_R has been dropped'); 
    end if; 

    execute immediate 'create role '||USER||'ADMIN_R'; 
    dbms_output.put_line('Role ' ||USER||'ADMIN_R has been created'); 

end; 

1-я попытка:

Role SCMADMIN_R has been created 

вторая попытка:

Role SCMADMIN_R has been dropped 
Role SCMADMIN_R has been created 
Смежные вопросы