sql >> Databáze >  >> RDS >> Oracle

Spusťte dynamické DDL v proceduře PL/SQL prostřednictvím oprávnění role definujícího

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.




  1. Proč spojení více dotazů MySQL pomocí středníků nefunguje s Perl DBI?

  2. Vložte data částečných výsledků do pole a odešlete

  3. Po odstranění záznamů na SQL Serveru resetujte seed identity

  4. Webová služba asp.net vysoké využití CPU