付録G.2 操作系SQLによるデータディクショナリ表の参照
HiRDBのデータディクショナリ表は,一般のHiRDBのデータベースと同様に,操作系のSQLで参照できます。なお,ディクショナリ表の認可識別子はMASTERとなります。
ここでは,検索時のSQLの記述例と,参照するために必要な定義情報について説明します。
参照するデータディクショナリ表の一覧を次の表に示します。
- 検索時のSQLの記述例
-
データディクショナリ表を検索するSQL文の例を次に示します。SQLの詳細については,マニュアル「HiRDB SQLリファレンス」を参照してください。
ディクショナリ表の参照権限の設定によっては,検索できる情報が限られます。データディクショナリ表の参照権限の設定については,マニュアル「HiRDB システム運用ガイド」を参照してください。
なお,ディクショナリ表を検索した後は,すぐにCOMMIT文を発行するか,又は検索例のようにWITHOUT LOCK NOWAITを指定するかしてください。
- <例1>
-
HiRDBのシステムにないRDエリアのサーバ名,HiRDBファイル名,及び所属するRDエリア名を知りたい場合
SELECT X.SERVER_NAME, PHYSICAL_FILE_NAME, X.RDAREA_NAME FROM MASTER.SQL_PHYSICAL_FILES X, MASTER.SQL_RDAREAS Y WHERE X.RDAREA_NAME=Y.RDAREA_NAME ORDER BY X.SERVER_NAME WITHOUT LOCK NOWAIT
- <例2>
-
自分の所有する表の列の定義情報の中から,列を含む表の名称,列名,データ型,及び列データ長を知りたい場合
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH FROM MASTER.SQL_COLUMNS WHERE TABLE_SCHEMA=USER※ ORDER BY TABLE_NAME WITHOUT LOCK NOWAIT
- <例3>
-
自分の所有する表のインデクス定義情報の中から,インデクスを含む表の名称,インデクスの名称,及びページ内未使用領域の比率を知りたい場合
SELECT TABLE_NAME, INDEX_NAME, FREE_AREA FROM MASTER.SQL_INDEXES WHERE TABLE_SCHEMA=USER※ ORDER BY TABLE_NAME WITHOUT LOCK NOWAIT
- <例4>
-
自分がアクセスできる表と,その表に対するアクセス権限の種類(SELECT権限,INSERT権限,DELETE権限,及びUPDATE権限)の有無について知りたい場合
SELECT TABLE_NAME, SELECT_PRIVILEGE, INSERT_PRIVILEGE, DELETE_PRIVILEGE, UPDATE_PRIVILEGE FROM MASTER.SQL_TABLE_PRIVILEGES WHERE GRANTEE=USER※ OR GRANTEE='PUBLIC' WITHOUT LOCK NOWAIT
- <例5>
-
コマンドをグループ指定するとき,対象となるRDエリア(先行文字列がRD1のRDエリア)の数を知りたい場合
SELECT COUNT(*) FROM MASTER.SQL_RDAREAS WHERE RDAREA_TYPE='U' AND RDAREA_NAME LIKE 'RD1%' WITHOUT LOCK NOWAIT
- <例6>
-
コマンドをグループ指定するとき,対象となるRDエリア(先行文字列がRD1のRDエリア)の名称を知りたい場合
SELECT RDAREA_NAME FROM MASTER.SQL_RDAREAS WHERE RDAREA_TYPE='U' AND RDAREA_NAME LIKE 'RD1%' ORDER BY RDAREA_NAME WITHOUT LOCK NOWAIT
- <例7>
-
自分の所有する非分割表(名称がT1の表)が格納されているRDエリアのRDエリア名を知りたい場合
SELECT X.RDAREA_NAME FROM MASTER.SQL_RDAREAS X, MASTER.SQL_TABLES Y WHERE Y.TABLE_SCHEMA=USER※ AND Y.TABLE_NAME='T1' AND X.RDAREA_NAME=Y.RDAREA_NAME WITHOUT LOCK NOWAIT
注※ USERは,実行ユーザの認可識別子を値に持つ変数です。認可識別子の詳細については,マニュアル「HiRDB SQLリファレンス」を参照してください。
- <例8>
-
データディクショナリLOB用RDエリアを再初期化するとき,実行時に使用するストアドプロシジャ及びストアドファンクションのオブジェクトを格納しているRDエリアの名称(オブジェクト格納用RDエリア名)を知りたい場合
SELECT RDAREA_NAME FROM MASTER.SQL_DIV_COLUMN WHERE TABLE_SCHEMA='HiRDB' AND TABLE_NAME='SQL_ROUTINES' AND COLUMN_NAME='ROUTINE_OBJECT' WITHOUT LOCK NOWAIT
注 データディクショナリLOB用RDエリアを再初期化した場合,実行後にすべてのSQLオブジェクトを再作成する必要があります。
- <例9>
-
無効となったSQLオブジェクト,又はインデクス無効状態のストアドプロシジャ及びストアドファンクションの名称を知りたい場合
SELECT ROUTINE_SCHEMA,ROUTINE_NAME FROM MASTER.SQL_ROUTINES WHERE ROUTINE_VALID='N' OR INDEX_VALID='N' WITHOUT LOCK NOWAIT
- <例10>
-
ユーザ定義関数FUNC1の引数に埋込み変数を利用する場合に,実際に使用するユーザ定義関数の引数のデータ型を知りたい場合
SELECT PARAMETER_NAME,DATA_TYPE,UDT_OWNER,UDT_NAME,PARAMETER_NO FROM MASTER.SQL_ROUTINE_PARAMS WHERE ROUTINE_SCHEMA=USER AND ROUTINE_NAME='FUNC1' ORDER BY PARAMETER_NO WITHOUT LOCK NOWAIT
- <例11>
-
ユーザ(USERA)が所有するすべての表を再編成する場合に,その表が格納されているRDエリアを知りたいとき(閉塞する必要があるRDエリアを知りたいとき)
非分割表の場合: SELECT DISTINCT(RDAREA_NAME) FROM MASTER.SQL_TABLES WHERE TABLE_SCHEMA=USERA AND RDAREA_NAME IS NOT NULL WITHOUT LOCK NOWAIT 分割表の場合: SELECT DISTINCT(RDAREA_NAME) FROM MASTER.SQL_DIV_TABLE WHERE TABLE_SCHEMA=USERA WITHOUT LOCK NOWAIT
求められたRDエリア名を重複排除した結果が,閉塞する必要があるRDエリア名となります。