sql >> Database teknologi >  >> RDS >> Oracle

Udfør dynamisk DDL i PL/SQL-procedure gennem definerer-rolletilladelser

Du kan kun indstille en rolle i en PL/SQL-lagret procedure/funktion, hvis den har Invoker's Rights (AUTHID CURRENT_USER )(se dokument) . Hvilket betyder, at du ikke kan bruge ops_user til at kalde admin_users procedure og derefter få adgang til admin_users roller. Hvis dine DBA'er insisterer på at bruge en rolle til at styre CREATE TABLE privilegium, her er den tilgang, jeg har set før:

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;

Dette vil midlertidigt give rollen til ops_user bare for at udføre din kode. Som standard bør ops_user ikke være i stand til at se admin_users pakketekstkilde. Du kan sandsynligvis pakke pakkens krop for yderligere at beskytte adgangskoden. Men bortset fra adgangskodesikkerhed, er min største bekymring med denne tilgang, at Oracle ikke giver en god måde at deaktivere en enkelt rolle på, så hvis ops_user har andre adgangskodebeskyttede roller, kan denne kode muligvis rejse en ORA-01979, når den forsøger at gendanne dem.

Så der er et svar, men jeg vil stadig anbefale at gøre, hvad de andre kommentatorer foreslog, og give din administratorbruger OPRET TABEL.




  1. SQL SELECT-syntaks – Listet efter DBMS

  2. Opgradering til PostgreSQL 11 med logisk replikering

  3. MySQL INTO OUTFILE tilsidesætte eksisterende fil?

  4. Genindlæs MySQL-data inde i en DIV ved hjælp af Ajax