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?
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 .
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
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';