- SQL
- PL/SQL
- PL/SQL Avanzato
- DBA
- Forms
- Tips and Tricks
 
 
 

 
 
> Area Sorgenti Oracle  
 

Assegnazione Dinamica di Privilegi
di Mirko Scognamiglio

Questo script realizza l'assegnazione dinamica dei privilegi agli utenti di SELECT, INSERT, UPDATE, DELETE, REFERENCES sulle tabelle o viste e deve essere lanciato dal proprietario degli oggetti che state assegnando. E' utile per aggiornare schemi separati attraverso l'utilizzo di procedure o trigger.
Si noti che il privilegio di REFERENCES può essere assegnato soltanto agli schemi e quindi questo script non funzionerà se si proverà ad assegnare tali privilegi ad un RUOLO.

Parametri:
s_user - Lista di utenti/ruoli da assegnare a.Devono essere separati da un punto
-----------------------------------------------------------------------------

set verify off
set pause off
set doc off
set heading off

accept s_user prompt 'Enter USERNAME or PUBLIC to grant to : '
prompt
show user
prompt 'Granting SELECT,INSERT,UPDATE,DELETE,REFERENCES only to &s_user'
prompt

DECLARE

  l_sql varchar2(254);
  cursor_id integer;
  result integer;

  l_target_user varchar2(80) := '&s_user';

cursor get_tab is
select table_name from user_tables ;

cursor get_view is
select view_name from user_views;

cursor get_seq is
select sequence_name from user_sequences;

BEGIN

cursor_id:=dbms_sql.open_cursor;

/* Tables first */

FOR tab_rec in get_tab LOOP

  l_sql := 'grant select,insert,update,delete,references on '||tab_rec.table_name
            ||' to '||l_target_user;
  dbms_sql.parse(cursor_id,l_sql,1);
  result := dbms_sql.execute(cursor_id);

END LOOP;

/* Views */

FOR view_rec in get_view LOOP

  l_sql := 'grant select,insert,update,delete on '||view_rec.view_name
            ||' to '||l_target_user;
  dbms_sql.parse(cursor_id,l_sql,1);
  result := dbms_sql.execute(cursor_id);

END LOOP;

/* Sequences */

FOR seq_rec in get_seq LOOP

  l_sql := 'grant select on '||seq_rec.sequence_name||' to '||l_target_user;
  dbms_sql.parse(cursor_id,l_sql,1);
  result := dbms_sql.execute(cursor_id);

END LOOP;

dbms_sql.close_cursor(cursor_id);

END;
/
spool off