Wie erteile ich einem Benutzer in IBM DB2 alle Berechtigungen für alle Tabellen in einem Schema?

9

Zunächst möchte ich eine Datenbank aus IBM DB2 AIX in IBM DB2-Fenster exportieren. Leider kann ich die Befehle BACKUP und RESTORE aufgrund eines unterschiedlichen Betriebssystemproblems nicht verwenden. Also muss ich auf den Befehl db2move zurückgreifen .

Ich hatte mein Schema und alle Tabellen aus der Datenbank dbemp in IBM DB2 AIX mit diesem Befehl exportiert :

db2move dbemp export -sn myschema

Als ich diesen Befehl ausführte , war ich als Benutzer mit dem Namen dbuser1 angemeldet .

Es werden eine Reihe von Dateien im aktuellen Ordner generiert. Ich greife nach den Dateien auf meinem lokalen Computer (Windows), auf dem IBM DB2 LUW installiert ist.

Jetzt habe ich in IBM DB2 meines lokalen Computers das vorhandene Schema myschema zuerst mithilfe von IBM Data Studio gelöscht (ich hatte auch eine lokale dbemp- Datenbank).

Dann habe ich die Dateien mit diesem Befehl importiert:

db2move dbemp import

Das Schema und die Tabellen wurden erfolgreich in die lokale Datenbank dbemp importiert .

Als ich die oben genannten Aktionen ausgeführt habe, habe ich mich als Benutzer winuser1 angemeldet .

Ich habe auch einen lokalen Benutzer namens dbuser1 auf meinem lokalen Computer (Windows). In IBM Data Studio habe ich ein Verbindungsprofil erstellt, das mit dem Benutzer dbuser1 eine Verbindung zum lokalen dbemp herstellt. Ich kann das Myschema- Schema und die Tabellen durchsuchen, aber die Daten der Tabelle nicht durchsuchen (ich habe einen Berechtigungsfehler erhalten). Der Benutzer winuser1 kann die Daten der Tabelle durchsuchen, aber zu Entwicklungszwecken muss ich mit dem Benutzer dbuser1 eine Verbindung zur Datenbank herstellen .

Also habe ich herausgefunden, dass ich einem Benutzer in der Tabelle folgende Berechtigungen gewähren kann:

GRANT ALL ON myschema.table1 TO USER dbuser1

Das Problem ist, dass ich 100 Tabellen habe. Ich möchte diese Zeilen nicht für jede Tabelle eingeben. Und leider gibt es auch keine solche Wildcard-Lösung:

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

Die Frage ist also, wie einem Benutzer alle Berechtigungen für alle Tabellen in einem Schema gewährt werden können. Oder gibt es eine alternative bessere Lösung? Vielleicht durch Kopieren aller Berechtigungen von winuser1 nach dbuser1 ?

Null
quelle

Antworten:

8

Wenn Sie auf alle Daten zugreifen möchten (dh auf alle Tabellen in allen Schemas), müssen Sie den Datenzugriff gewähren.

db2 grant dataaccess on database to user winuser1

Wenn Sie nur möchten, dass winuser1 nur auf die 100 Tabellen in dem Schema zugreift, auf das Sie sich beziehen, gibt es leider keine einfache Möglichkeit, SELECT für jede Tabelle zu gewähren. Davon abgesehen kann dies durch Skripterstellung erreicht werden.

Sie könnten Folgendes tun

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

Dies nutzt die Abfrage der Systemkataloge, um dynamisch ein Skript für Berechtigungssachen zu generieren. Auf diese Weise erteilen wir Benutzern Berechtigungen, auf die wir keinen Datenzugriff gewähren möchten.

Hier ist eine gute Seite der Behörden für DB2 .

Chris Aldrich
quelle
danke, db2 grant dataaccessfunktioniert. Es macht mir nichts aus, sie allen Schemas zuzuweisen, da ich mich in einer Entwicklungsumgebung befinde.
null
0

Wenn Sie einen SQL-Editor wie Toad verwenden, kann dieses Skript ebenfalls hilfreich sein. Sie können die Ergebnisse in ein neues Fenster kopieren / einfügen.

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';
John Arick
quelle
0

Sie können auch versuchen (mit einem SQL-Editor):

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
Florin Dragan
quelle