DB2勉強する

2016年09月

特権と権限の確認

DB2の特権と権限

公式見てると特権と権限で混乱する。

  • 権限・・・DBADMやSECADM、DATAACCESSなど
  • 特限・・・同じみgrant select、grant insertなど

らしい。Oracle界のシステム権限がDB2の権限。Oracle界のオブジェクト権限がDB2界の特権のようだ。 何はともかく確認したいときのシステム・カタログ。

ロールの一覧

SELECT * FROM SYSCAT.ROLES

ロールのメンバー一覧

SELECT * FROM SYSCAT.ROLEAUTH

各テーブルのGRANT(特権)一覧

SELECT * FROM SYSCAT.TABAUTH

各スキーマのGRANT一覧

SELECT * FROM SYSCAT.SCHEMAAUTH

権限一覧

GRANTEEのPUBLICは、全ユーザが対象なので基本的な権限を確認しておいたほうがよい。

SELECT * FROM SYSCAT.DBAUTH
SELECT * FROM SYSIBM.SYSDBAUTH

おまけ

Create Table時に自動で付与されるCONTROL権限

Create table後にSYSCAT.TABAUTHを参照すると、SYSIBMからそのテーブルのCONTROL権限が付与されているのがわかる。CONTROL権限は、そのテーブル操作で必要なコマンドが一式揃っている権限。

Connectの権限

OracleのCREATE SESSION権限にあたるCONNECT権限だが、DB2では、PUBLICに付与されているため設定は不要。

他スキーマに対する権限

DB2ではデフォルトでPUBLICに対しSYSIBMからCREATEIN 特権が付与されているため、だれでも他スキーマにCreate tableできる。

DDL文を取得する。

db2lookを使う

DDLを取得するには、OracleではDBMS_METADATA.GET_DDLなどがあるが、DB2の場合、 db2lookコマンドとなる。 個々のオブジェクト単位で取得するのではなく、データベース作成から全てのオブジェクトまで、すべてのDDLが一枚のテキストファイルに出力されるので、大変便利だ。

db2look -d ${DB名} -e -z ${スキーマ名} -i ${ユーザ名} -w ${パスワード名}

EXPORTとIMPORT、LOAD

IXF形式とDEL形式がある。DB2間でやるなら、IXF形式のほうがお手軽。DEL形式はCSVファイル他システムとのIFで使うと便利。

EXPORT

db2 "EXPORT TO ${ファイル名} OF IXF MESSAGES ${ログ名} SELECT * FROM ${テーブル名}"

IMPORT

db2 "IMPORT FROM ${ファイル名} OF IXF MESSAGES ${ログ名} REPLACE INTO ${テーブル名}"

LOAD

db2 "LOAD FROM ${ファイル名} OF IXF MESSAGES ${ログ名} REPLACE INTO ${テーブル名}"

別テーブルからLOADするなら、カーソルを使うと簡単。

db2 "DECLARE C1 CURSOR FOR SELECT * FROM ${テーブル名}"
db2 "LOAD FROM C1 OF CURSOR MESSAGES ${ログ名} INSERT INTO ${テーブル名}"

カタログ登録すれば、別DBのデータもLOADできる

db2 -t "DECLARE C1 CURSOR 
      DATABSE ${カタログ名}
      USER ${ユーザ名}
      USING ${パスワード}
      FOR SELECT * FROM ${テーブル名}"

CSV形式の区切り文字、囲い文字について

CSV形式のEXPORT,IMPORT時の囲い文字はchardel、区切り文字はcoldelで指定できる。バッチで実行することも加味して、ascii16進数で設定するのがお薦め。 以下はダブルクォーテーション(0x22)で囲い文字として指定した場合。

db2 "LOAD FROM ${ファイル名} OF DEL MODIFIED BY chardel0x22 coldel, MESSAGES ${ログファイル名} REPLACE INTO ${テーブル名}"

IXFファイルから強制的にテーブルを作成(FORCECREATE )

IXF形式の場合、IMPORT時に存在しないテーブル名を指定することで、新規にテーブルを作成してデータを挿入してくれる。本番でEXPORTしたモニター表関数のIXFデータを開発とかで見る時に便利。

db2 "IMPORT FROM ${ファイル名} OF IXF MODIFIED BY FORCECREATE MESSAGES ${ログファイル名} CREATE INTO ${任意のテーブル名}"

まとめてインポート・エクスポート

いちいち個々のテーブルにIMPORT・EXPORTは手間の場合、db2moveでまとめて実行できる。

db2move ${DB名} export -u ${ユーザ名] -p ${パスワード} -aw
db2move ${DB名} import -u ${ユーザ名] -p ${パスワード} 

XML型やLOB型はオプション必要だったような気がするが調査中

状況を確認したいとき

大量のデータのため時間がかかっており、状況を確認したい場合は、別のCLPから以下を実行しよう。

db2 LIST UTILITIES SHOW DETAIL

(おまけ) SQL27981W

[SQL27981W ユーティリティーはターゲット表またはソース表内で接続されたか、またはデタッチされたデータ・パーティションがあるかどうかを検査できませんでした。]

データをリストアした別環境で発生することがある。(おそらく環境間の構成の違いが原因) diag.logで確認したところ、SQLUHK0Aパッケージが外れてるようだった。以下を実行して再実行するとうまくいった。

db2 REBIND NULLID.SQLUHK0A
記事検索