Я думаю, что правильный подход заключается в создании роли, предоставлении роли пользователю, а затем SET РОЛЬ:
EXECUTE IMMEDIATE 'SET ROLE '||some_role;
Используйте
EXECUTE IMMEDIATE 'SET ROLE NONE';
чтобы сбросить роль снова. Конечно, когда вы предоставляете роль пользователю, она не должна быть установлена как DEFAULT ROLE.
Проблема с GRANT some_role TO ...
заключается в том, что она вступает в силу только после повторного входа пользователя в систему.
Вы также можете использовать DBMS_SESSION.SET_ROLE('some_role');
и DBMS_SESSION.IS_ROLE_ENABLED('some_role')
, чтобы проверить, включена ли роль. См. DBMS_SESSION.SET_ROLE