43 votes

Accorder une sélection sur toutes les tables appartenant à un utilisateur spécifique

Je dois accorder à un autre utilisateur le droit de sélectionner toutes les tables appartenant à un utilisateur spécifique. Puis-je le faire avec une seule commande du type :

Grant Select on OwningUser.* to ReceivingUser

Ou dois-je générer le sql pour chaque table avec quelque chose du genre :

 Select 'GRANT SELECT ON OwningUser.'||Table_Name||'TO ReceivingUser' 
 From All_Tables Where Owner='OWNINGUSER'

64voto

DCookie Points 22921

Ce n'est pas une déclaration unique, mais c'est le mieux que l'on puisse faire avec Oracle :

BEGIN
   FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner='TheOwner') LOOP
      EXECUTE IMMEDIATE 'grant select on '||R.owner||'.'||R.table_name||' to TheUser';
   END LOOP;
END;

2 votes

Aussi for v in (select OWNER, VIEW_NAME from ALL_VIEWS where OWNER = 'XXX') loop

2 votes

Juste une observation que le défi avec cette approche est qu'elle est "ponctuelle" - toutes les tables ajoutées ultérieurement seront exclues. Il serait BEAUCOUP plus agréable d'avoir une déclaration conceptuelle "accorder un accès en lecture seule à toute table appartenant à un certain schéma à un certain utilisateur" car on pourrait garantir que toute table appartenant à un certain schéma serait lisible par un certain utilisateur.

0 votes

Cela se termine par l'erreur "table or view does not exists" même si j'essaie de "SELECT owner, table_name FROM all_tables WHERE owner='TheOwner'" - cela me donne une ligne, donc la sélection est OK, mais la boucle entière se termine avec l'erreur mentionnée.

3voto

user2729366 Points 11

Oui, c'est possible, lancez cette commande :

Disons que vous avez un utilisateur appelé thoko

grant select any table, insert any table, delete any table, update any table to thoko;

note : a travaillé sur une base de données oracle

4 votes

Ceci l'accordera sur tous les schémas, et nécessitera un privilège système afin de l'accorder.

2voto

dcvetkov Points 21

Tables + vues + rapports d'erreurs

SET SERVEROUT ON
DECLARE
  o_type VARCHAR2(60) := '';
  o_name VARCHAR2(60) := '';
  o_owner VARCHAR2(60) := '';
  l_error_message VARCHAR2(500) := '';
BEGIN
  FOR R IN (SELECT owner, object_type, object_name
            FROM all_objects 
            WHERE owner='SCHEMANAME'
            AND object_type IN ('TABLE','VIEW')
            ORDER BY 1,2,3) LOOP
    BEGIN
    o_type := r.object_type;
    o_owner := r.owner;
    o_name := r.object_name;
    DBMS_OUTPUT.PUT_LINE(o_type||' '||o_owner||'.'||o_name);
    EXECUTE IMMEDIATE 'grant select on '||o_owner||'.'||o_name||' to USERNAME';
    EXCEPTION
      WHEN OTHERS THEN
        l_error_message := sqlerrm;
        DBMS_OUTPUT.PUT_LINE('Error with '||o_type||' '||o_owner||'.'||o_name||': '|| l_error_message);
        CONTINUE;
    END;
  END LOOP;
END;
/

0voto

J. Chomel Points 5832

De http://psoug.org/reference/roles.html Pour cela, créez une procédure dans votre base de données pour que votre utilisateur puisse le faire :

CREATE OR REPLACE PROCEDURE GRANT_SELECT(to_user in varchar2) AS

  CURSOR ut_cur IS SELECT table_name FROM user_tables;

  RetVal  NUMBER;
  sCursor INT;
  sqlstr  VARCHAR2(250);

BEGIN
    FOR ut_rec IN ut_cur
    LOOP
      sqlstr := 'GRANT SELECT ON '|| ut_rec.table_name || ' TO ' || to_user;
      sCursor := dbms_sql.open_cursor;
      dbms_sql.parse(sCursor,sqlstr, dbms_sql.native);
      RetVal := dbms_sql.execute(sCursor);
      dbms_sql.close_cursor(sCursor);

    END LOOP;
END grant_select;

0voto

cagcowboy Points 13721

Seulement via la deuxième option AFAIK.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X