CLI の手引きおよび解説書

SQLColumnPrivileges - 表の列に関連した特権を入手する

目的


仕様: DB2 CLI 2.1 ODBC 1.0  

SQLColumnPrivileges() は、指定された表の列とそれに関連した特権のリストを返します。情報は SQL 結果セット内に返されますが、照会で生成された結果セットの処理に使用される関数と同じ関数を使用して、情報を検索することができます。

構文

SQLRETURN SQLColumnPrivileges(
                SQLHSTMT          StatementHandle,   /* hstmt */
                SQLCHAR      *FAR CatalogName,       /* szCatalogName */
                SQLSMALLINT       NameLength1,       /* cbCatalogName */
                SQLCHAR      *FAR SchemaName,        /* szSchemaName */
                SQLSMALLINT       NameLength2,       /* cbSchemaName */
                SQLCHAR      *FAR TableName          /* szTableName */
                SQLSMALLINT       NameLength3,       /* cbTableName */
                SQLCHAR      *FAR ColumnName,        /* szColumnName */
                SQLSMALLINT       NameLength4);      /* cbColumnName */

関数引き数


表 36. SQLColumnPrivileges 引き数
データ・タイプ 引き数 使用法 説明
SQLHSTMT StatementHandle 入力 ステートメント・ハンドル。
SQLCHAR * CatalogName 入力 3 つの部分から成る表名のカタログ修飾子。これは、ヌル・ポインターまたは長さゼロのストリングでなければなりません。
SQLSMALLINT NameLength1 入力 CatalogName の長さ。これは、0 に設定する必要があります。
SQLCHAR * SchemaName 入力 表名のスキーマ修飾子。
SQLSMALLINT NameLength2 入力 SchemaName の長さ。
SQLCHAR * TableName 入力 表名。
SQLSMALLINT NameLength3 入力 TableName の長さ。
SQLCHAR * ColumnName 入力 列名で結果セットを修飾するためのパターン値 を入れられるバッファー。
SQLSMALLINT NameLength4 入力 ColumnName の長さ。

使用法

結果は、『SQLColumnPrivileges で返される列』にリストされている列を含む標準結果セットとして返されます。結果セットは、TABLE_CAT、 TABLE_SCHEM、TABLE_NAME、COLUMN_NAME、および PRIVILEGE の順序になります。複数の特権が指定列に関連付けられている場合、各特権は個別の行として返されます。通常のアプリケーションでは、 SQLColumns() を呼び出して列特権情報を判別してから、この関数を呼び出すこともできます。アプリケーションは、 SQLColumns() 結果セットの TABLE_SCHEM、TABLE_NAME、 COLUMN_NAME 列に返される文字ストリングを、この関数の入力引き数として使用することになります。

多くの場合に SQLColumnPrivileges() の呼び出しはシステム・カタログに対する複雑な (したがってコストのかかる) 照会に多くの場合マッピングされるため、それらの呼び出しの使用を少なくし、呼び出しを繰り返すのではなく結果を保管するようにしてください。

カタログ関数の結果セットの VARCHAR 列は、 SQL92 の制限に従うように、128 の最大長属性で宣言されています。 DB2 名は 128 文字よりも少ないので、アプリケーションは、出力バッファー用に 128 文字 (およびヌル終止符) を常にとっておくか、あるいは、接続している DBMS がサポートしている TABLE_CAT、TABLE_SCHEM、 TABLE_NAME、および COLUMN_NAME 列の実際の長さをそれぞれ判別するために、 SQL_MAX_CATALOG_NAME_LEN、 SQL_MAX_SCHEMA_NAME_LEN、 SQL_MAX_TABLE_NAME_LEN、および SQL_MAX_COLUMN_NAME_LEN を使用して、選択的に SQLGetInfo() を呼び出すようにすることができます。

ColumnName 引き数は探索パターンを受け入れることに留意してください。有効な探索パターンの詳細については、カタログ関数での入力引き数を参照してください。

将来のリリースでは、列が新たに追加されたり、既存の列の名前が変更されたりする可能性はありますが、現行の列の位置が変更されることはありません。

SQLColumnPrivileges で返される列

列 1 TABLE_CAT (VARCHAR(128) データ・タイプ)
これは常に NULL です。

列 2 TABLE_SCHEM (VARCHAR(128) データ・タイプ)
TABLE_NAME を含むスキーマの名前。

列 3 TABLE_NAME (VARCHAR(128) 非 NULL データ・タイプ)
表または視点の名前。

列 4 COLUMN_NAME (VARCHAR(128) 非 NULL データ・タイプ)
指定された表または視点の列の名前。

列 5 GRANTOR (VARCHAR(128) データ・タイプ)
特権を付与したユーザーの許可 ID。

列 6 GRANTEE (VARCHAR(128) データ・タイプ)
特権が付与されたユーザーの許可 ID。

列 7 PRIVILEGE (VARCHAR(128) データ・タイプ)
列の特権。これには、以下の種類があります。

注:いくつかの IBM RDBMS は、列レベルでの列レベル特権を提供していません。 DB2 ユニバーサル・データベース、DB2 (MVS/ESA 版) および DB2 (VSE および VM 版) は、UPDATE (更新) 列特権をサポートしており、この結果セットには各更新可能な列につき 1 行が割り当てられています。 DB2 ユニバーサル・データベース、DB2 (MVS/ESA 版)、DB2 (VSE および VM 版) のその他すべての特権、およびその他の IBM RDBMS についてのすべての特権には、表レベルで特権が付与されている場合は、この結果セットで 1 行が割り当てられます。

列 8 IS_GRANTABLE (VARCHAR(3) データ・タイプ)
特権を付与されたユーザーが他のユーザーに特権を付与できるかどうかを示します。

「YES」または「NO」。

注:DB2 CLI が使用する列名は、X/Open CLI CAE 仕様のスタイルに準拠しています。列の名前、内容および順序は、 ODBC の SQLColumnPrivileges() 結果セットに指定されたものと同一です。

ある列に関連した特権が複数ある場合、各特権は結果セット内の個別の行として返されます。

戻りコード

診断


表 37. SQLColumnPrivileges SQLSTATE
SQLSTATE 説明 解説
24000 カーソル状態が無効です。 カーソルはすでに、ステートメント・ハンドル上にオープンされています。
40001 逐次化障害 トランザクションは、別のトランザクションとの資源デッドロックのためにロールバックされました。
40003 08S01 通信リンクに障害が起きました。 アプリケーションとデータ・ソースとの間の通信リンクが、関数の完了する前に失敗しました。
HY001 メモリーの割り振り失敗です。 DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを割り振ることができません。
HY008 操作が取り消しになりました。

非同期処理が StatementHandle に対して使用可能になりました。関数が呼び出され、その実行が完了する前に、 SQLCancel()StatementHandle で呼び出されました。そして、関数が再び StatementHandle で呼び出されました。

関数が呼び出され、その実行が完了する前に、 SQLCancel() が複数スレッドのアプリケーション内の別のスレッドから、 StatementHandle で呼び出されました。

HY010 関数順序エラー

非同期実行関数 (この関数ではない) が StatementHandle で呼び出され、この関数は、呼び出し時に依然実行中でした。

SQLExecute()SQLExecDirect()、または SQLSetPos()StatementHandle で呼び出され、 SQL_NEED_DATA を戻しました。データがすべての実行時データ・パラメーターまたは列用に送られる前に、この関数が呼び出されました。

HY009 引き数値が無効です。 TableName が NULL です。
HY014 もはやハンドルはありません。 DB2 CLI は、内部資源が原因でハンドルを割り当てることができませんでした。
HY090 ストリングまたはバッファー長が無効です。 名前の長さ引き数のうちの 1 つの値は 0 より小さい値でしたが、SQL_NTS と等しくありませんでした。
HYC00 ドライバーが機能していません。 DB2 CLI は、表名の修飾子としてカタログ をサポートしません。
HYT00 タイムアウトになりました。 データ・ソースが結果セットを返す前に、タイムアウト期間が満了しました。タイムアウトは、 Windows 3.1 や Macintosh System 7 のようなマルチタスクではないシステム上でのみサポートされています。タイムアウト期間は、 SQLSetConnectAttr() の SQL_ATTR_QUERY_TIMEOUT 属性を使用して設定することができます。

制約

なし。

CLI サンプル tbinfo.c

(ここで完全サンプル tbinfo.c を使用することもできます 。)

/* From the CLI sample TBINFO.C */
/* ... */
    /* call SQLColumnPrivileges */
    printf("\n    Call SQLColumnPrivileges for:\n");
    printf("        tbSchema = %s\n", tbSchema);
    printf("        tbName = %s\n", tbName);
    sqlrc = SQLColumnPrivileges( hstmt, NULL, 0,
                                 tbSchema, SQL_NTS,
                                 tbName, SQL_NTS,
                                 colNamePattern, SQL_NTS);
 
 

参照


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]