web-dev-qa-db-ja.com

スキーマ内のすべてのテーブルに対するすべての特権をIBM DB2のユーザーに付与する方法は?

まず、データベースをIBM DB2 AIXからIBM DB2ウィンドウにエクスポートします。残念ながら、OSの問題により、BACKUPとRESTOREコマンドを使用できません。したがって、私はdb2moveコマンドを使用する必要があります。

次のコマンドを使用して、リモートIBM DB2 AIXのdbempデータベースからmyschemaスキーマとすべてのテーブルをエクスポートしました。

db2move dbemp export -sn myschema

そのコマンドを実行すると、dbuser1という名前のユーザーとしてログインしました。

現在のフォルダーに一連のファイルを生成します。 IBM DB2 LUWがインストールされているローカルマシン(Windows)にファイルを取得します。

次に、ローカルマシンのIBM DB2で、IBM Data Studioを使用して、まず既存のスキーマmyschemaを削除しました(ローカルdbempデータベースもありました)。

次に、次のコマンドを使用してファイルをインポートしました。

db2move dbemp import

スキーマとテーブルをローカルdbempデータベースに正常にインポートします。

上記のアクションを実行したとき、ユーザーwinuser1としてログインしていました。

ローカルマシン(windows)にもdbuser1という名前のローカルユーザーがいます。 IBM Data Studioで、ローカルに接続する接続プロファイルを作成しましたdbempdbuser1 userを使用して、myschemaスキーマとテーブルを参照できますが、テーブルのデータを参照できません(特権エラーが発生しました)。ユーザーwinuser1はテーブルのデータを参照できますが、開発の目的で、ユーザーdbuser1を使用してデータベースに接続する必要があります。

そのため、次のようにテーブルのユーザーに特権を付与できることがわかりました。

GRANT ALL ON myschema.table1 TO USER dbuser1

問題は、100個のテーブルがあることです。テーブルごとにその行を入力したくありません。そして、残念ながら、このようなワイルドカードソリューションもありません。

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

したがって、問題は、スキーマ内のすべてのテーブルに対するすべての特権をユーザーにどのように付与するかということです。または、より良い代替ソリューションはありますか?多分winuser1からdbuser1にすべての特権をコピーすることによって?

9
null

すべてのデータ(つまり、すべてのスキーマのすべてのテーブル)にアクセスする場合は、dataaccessを付与する必要があります。

db2 grant dataaccess on database to user winuser1

Winuser1が参照しているスキーマ内の100個のテーブルのみにアクセスするようにしたい場合、残念ながら簡単な方法はなく、各テーブルにSELECTを付与する必要があります。そうは言っても、それはスクリプトで実現できます。

あなたは次のことができます

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

これは、システムカタログのクエリを利用して、許可を与えるスクリプトを動的に生成します。これは、データへのアクセスを許可したくないユーザーに許可を与える方法の多くです。

これが DB2の権限の良いページ です。

8
Chris Aldrich

(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

ToadなどのSQLエディタを使用している場合は、このスクリプトも役立つ場合があります。結果を新しいウィンドウにコピーして貼り付けることができます。

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