web-dev-qa-db-fra.com

Comment accorder tous les privilèges sur toutes les tables d'un schéma à un utilisateur dans IBM DB2?

Tout d'abord, je souhaite exporter la base de données d'IBM DB2 AIX vers les fenêtres IBM DB2. Malheureusement, je ne peux pas utiliser la commande BACKUP et RESTORE en raison d'un problème de système d'exploitation différent. Je dois donc recourir à la commande db2move.

J'avais exporté le schéma myschema et toutes les tables de la base de données dbemp dans IBM DB2 AIX distant à l'aide de cette commande:

db2move dbemp export -sn myschema

Lorsque j'ai exécuté cette commande, j'étais connecté en tant qu'utilisateur nommé dbuser1.

Il génère un tas de fichiers dans le dossier actuel. J'attrape les fichiers dans ma machine locale (Windows) sur laquelle IBM DB2 LUW est installé.

Maintenant, dans IBM DB2 de ma machine locale, j'ai abandonné le schéma existant myschema d'abord en utilisant IBM Data Studio (j'avais aussi une base de données locale dbemp aussi).

J'ai ensuite importé les fichiers à l'aide de cette commande:

db2move dbemp import

Il a réussi à importer le schéma et les tables dans la base de données locale dbemp.

Lorsque j'ai fait les actions ci-dessus, j'étais connecté en tant qu'utilisateur winuser1.

J'ai également un utilisateur local nommé dbuser1 dans ma machine locale (Windows). Dans IBM Data Studio, j'ai créé un profil de connexion qui se connecte à l'utilisateur local dbemp en utilisant dbuser1 et je peux parcourir myschema le schéma et les tables, mais Je ne peux pas parcourir les données de la table (j'ai une erreur de privilège). L'utilisateur winuser1 peut parcourir les données de la table, mais à des fins de développement, je dois me connecter à la base de données en utilisant l'utilisateur dbuser1.

J'ai donc découvert que je pouvais accorder des privilèges à un utilisateur sur la table comme ceci:

GRANT ALL ON myschema.table1 TO USER dbuser1

Le problème est que j'ai 100 tables, je ne veux pas taper ces lignes pour chaque table. Et malheureusement, il n'existe pas non plus de solution générique comme celle-ci:

GRANT ALL ON myschema.* TO USER dbuser1 -- this doesn't work

La question est donc de savoir comment accorder tous les privilèges sur toutes les tables d'un schéma à un utilisateur? Ou existe-t-il une meilleure solution alternative? peut-être en copiant tous les privilèges de winuser1 vers dbuser1?

9
null

Si vous souhaitez accéder à toutes les données (c'est-à-dire à toutes les tables de tous les schémas), vous devez accorder l'accès aux données.

db2 grant dataaccess on database to user winuser1

Si vous voulez que winuser1 n'accède qu'aux 100 tables du schéma auquel vous faites référence, alors malheureusement, il n'y a pas de moyen simple, vous devrez accorder SELECT sur chaque table. Cela étant dit, cela peut être accompli grâce à des scripts.

Vous pouvez faire ce qui suit

db2 -tnx "select distinct 'GRANT ALL ON TABLE '||
    '\"'||rtrim(tabschema)||'\".\"'||rtrim(tabname)||'\" TO USER winuser1;'
    from syscat.tables
    where tabschema = 'myschema' "  >> grants.sql

db2 -tvf grants.sql

Cela permet d'interroger les catalogues système pour générer dynamiquement un script pour autoriser les choses. C'est en grande partie la façon dont nous autorisons les utilisateurs auxquels nous ne voulons pas donner accès aux données.

Voici une bonne page des autorités pour DB2 .

8
Chris Aldrich

Vous pouvez également essayer (à l'aide d'un éditeur SQL):

BEGIN
 FOR v AS cur CURSOR FOR 
    select 
        'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || trim(tabschema) || '.' || trim(tabname) || ' TO YourUser' stmt 
    from 
        syscat.tables 
    where 
        tabschema = 'YourSchema' 
  DO 
    EXECUTE IMMEDIATE v.stmt;
  END FOR;
END
0
Florin Dragan

Si vous utilisez un éditeur SQL comme Toad, ce script peut également vous aider. Vous pouvez copier/coller les résultats dans une nouvelle fenêtre.

SELECT DISTINCT
      'GRANT Select ON TABLE '
   || rtrim (tabschema)
   || '.'
   || rtrim (tabname)
   || ' TO USER USERNAME;'
  FROM syscat.tables
 WHERE tabschema = 'Schema'
 UNION
 SELECT    'GRANT Select ON VIEW '
   || rtrim (VIEWSCHEMA)
   || '.'
   || rtrim (viewname)
   || ' TO USER USERNAME;'
 FROM SYSCAT.VIEWS
 WHERE VIEWSCHEMA = 'Schema';
0
John Arick