15 votes

Voie correcte pour donner aux utilisateurs l'accès à des schémas supplémentaires dans Oracle

J'ai deux utilisateurs Bob et Alice dans Oracle, tous les deux créés en exécutant les commandes suivantes en tant que sysdba depuis sqlplus :

   create user $blah identified by $password;
   grant resource, connect, create view to $blah;

Je veux que Bob ait un accès complet au schéma d'Alice (c'est-à-dire, à toutes les tables), mais je ne sais pas quel attribut exécuter, et s'il doit être exécuté en tant que sysdba ou en tant qu'Alice.

Je serais ravi de recevoir des conseils sur des références utiles également -- je ne semble pas pouvoir obtenir de réponse satisfaisante à partir d'Internet ou de "Oracle Database 10g The Complete Reference", qui est posé sur mon bureau.

22voto

cagcowboy Points 13721

À ma connaissance, vous devez effectuer les grants object un par un.

En général, vous utiliseriez un script pour cela, quelque chose du genre :

SÉLECTIONNER 'GRANT ALL ON '||table_name||' TO BOB ;'
À PARTIR DE   TOUTES_LES_TABLES
OÙ  PROPRIÉTAIRE = 'ALICE';

Et de même pour les autres objets de la base de données.

Vous pourriez mettre un package dans chaque schéma à partir duquel vous devez délivrer le grant qui passera par tous les appels de chaque instruction GRANT via un EXECUTE IMMEDIATE.

par exemple

   PROCÉDURE GRANT_TABLES
   EST
   DÉBUT

      POUR tab IN (SÉLECTIONNER table_name
                   DE   toutes_les_tables
                   OÙ  propriétaire = cet_utilisateur) LOOP
         EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' À autre_utilisateur';
      FIN LOOP;
   FIN;

7voto

Matt Thomason Points 2197

Il y a beaucoup de choses à considérer. Lorsque vous parlez d'accès, voulez-vous préfixer les tables avec le nom des autres utilisateurs ? Vous pouvez utiliser des synonymes publics pour cacher le propriétaire d'origine, si c'est un problème. Ensuite, accordez des privilèges sur le synonyme.

Vous voulez également planifier autant que possible à l'avance. Plus tard, voulez-vous que Frank puisse également accéder au schéma d'Alice ? Vous ne voulez pas devoir réaccorder des privilèges sur N tables. Utiliser un rôle de base de données serait une meilleure solution. Accordez la sélection au rôle "ALICE_TABLES" par exemple et lorsque qu'un autre utilisateur a besoin d'accès, accordez-lui simplement le privilège au rôle. Cela permet d'organiser les autorisations que vous accordez à l'intérieur de la base de données.

7voto

arnep Points 2737

Une autre solution si vous avez un propriétaire différent:

DÉBUT

  POUR x DANS (SELECT owner||'.'||table_name ownertab
            FROM   all_tables
            WHERE  owner IN ('A', 'B', 'C', 'D'))
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' À autre_utilisateur';
  END LOOP;
END;

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