まず、データベースを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にすべての特権をコピーすることによって?
すべてのデータ(つまり、すべてのスキーマのすべてのテーブル)にアクセスする場合は、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の権限の良いページ です。
(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
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';