仕様: | 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 */
関数引き数
データ・タイプ | 引き数 | 使用法 | 説明 |
---|---|---|---|
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 引き数は探索パターンを受け入れることに留意してください。有効な探索パターンの詳細については、カタログ関数での入力引き数を参照してください。
将来のリリースでは、列が新たに追加されたり、既存の列の名前が変更されたりする可能性はありますが、現行の列の位置が変更されることはありません。
注: | いくつかの IBM RDBMS は、列レベルでの列レベル特権を提供していません。 DB2 ユニバーサル・データベース、DB2 (MVS/ESA 版) および DB2 (VSE および VM 版) は、UPDATE (更新) 列特権をサポートしており、この結果セットには各更新可能な列につき 1 行が割り当てられています。 DB2 ユニバーサル・データベース、DB2 (MVS/ESA 版)、DB2 (VSE および VM 版) のその他すべての特権、およびその他の IBM RDBMS についてのすべての特権には、表レベルで特権が付与されている場合は、この結果セットで 1 行が割り当てられます。 |
「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 属性を使用して設定することができます。 |
制約
なし。
(ここで完全サンプル 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);
参照