Roli můžete nastavit v rámci uložené procedury/funkce PL/SQL, pouze pokud má Práva vyvolávače (AUTHID CURRENT_USER
)(viz dokument)
. Což znamená, že nemůžete použít ops_user k volání procedury admin_user a následnému přístupu k rolím admin_user. Pokud vaši správci databází trvají na použití role k ovládání CREATE TABLE
privilegium, zde je přístup, který jsem již viděl:
create or replace package admin_user.role_test authid current_user is
procedure test_permissions;
end role_test;
/
create or replace package body admin_user.role_test is
procedure test_permissions is
v_query_string VARCHAR2(400 CHAR) := 'begin
dbms_output.put_line(''after'');
for r in (select role from session_roles) loop
dbms_output.put_line(r.role);
end loop;
end;';
begin
dbms_output.put_line('before');
for r in (select role from session_roles) loop
dbms_output.put_line(r.role);
end loop;
DBMS_SESSION.SET_ROLE('CREATE_TABLE_ROLE IDENTIFIED BY "SECRET_PASSWORD"');
execute immediate v_query_string;
DBMS_SESSION.SET_ROLE('ALL EXCEPT CREATE_TABLE_ROLE'); -- restore defaults
end;
end role_test;
/
grant execute on admin_user.role_test to ops_user;
Tím dočasně udělíte roli ops_user, aby mohl spustit váš kód. Ve výchozím nastavení by ops_user neměl být schopen zobrazit zdroj těla balíčku admin_user. Pravděpodobně byste mohli obalit tělo balíčku, abyste heslo dále chránili. Ale pomineme-li zabezpečení heslem, můj největší problém s tímto přístupem je, že Oracle nenabízí příjemný způsob, jak deaktivovat jednu roli, takže pokud má ops_user další role chráněné heslem, může tento kód při pokusu o obnovení vyvolat ORA-01979. je.
Existuje tedy odpověď, ale přesto bych doporučil udělat to, co navrhli ostatní komentující, a udělit CREATE TABLE vašemu administrátorovi.