SQLColumnPrivileges 函数
一致性
引入的版本:ODBC 1.0 标准合规性:ODBC
摘要
SQLColumnPrivileges 返回指定表的列和关联特权的列表。 驱动程序以指定 StatementHandle 上的结果集的形式返回信息。
语法
SQLRETURN SQLColumnPrivileges(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLCHAR * ColumnName,
SQLSMALLINT NameLength4);
参数
StatementHandle
[输入]语句句柄。
CatalogName
[输入]目录名称。 如果驱动程序支持某些目录的名称,但不支持其他目录的名称,例如当驱动程序从不同的 DBMS 检索数据时,空字符串 (“”) 表示那些没有名称的目录。 CatalogName 不能包含字符串搜索模式。
如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 CatalogName 被视为标识符,其大小写并不重要。 如果为SQL_FALSE, 则 CatalogName 是一个普通参数;它按字面处理,其大小写很重要。 有关详细信息,请参阅 目录函数中的参数。
NameLength1
[输入]*CatalogName 的长度(以字符为单位)。
SchemaName
[输入]架构名称。 如果驱动程序支持某些表的架构,但不支持其他表的架构,例如当驱动程序从不同的 DBMS 检索数据时,空字符串 (“”) 表示那些没有架构的表。 SchemaName 不能包含字符串搜索模式。
如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 SchemaName 被视为标识符。 如果它是SQL_FALSE, 则 SchemaName 是一个普通参数;它按字面处理,其大小写很重要。
NameLength2
[输入]*SchemaName 的长度(以字符为单位)。
TableName
[输入]表名称。 此参数不能为 null 指针。 TableName 不能包含字符串搜索模式。
如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 TableName 被视为标识符,其大小写并不重要。 如果它是SQL_FALSE, 则 TableName 是一个普通参数;它按字面处理,其大小写很重要。
NameLength3
[输入]*TableName 的长度(以字符为单位)。
ColumnName
[输入]列名的字符串搜索模式。
如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 ColumnName 被视为标识符,其大小写并不重要。 如果SQL_FALSE, 则 ColumnName 是模式值参数;它按字面处理,其大小写很重要。
NameLength4
[输入]*ColumnName 的长度(以字符为单位)。
返回
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
诊断
当 SQLColumnPrivileges 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过使用 handleType 为 SQL_HANDLE_STMT 和 Handle of StatementHandle 调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。 下表列出了 SQLColumnPrivileges 通常返回的 SQLSTATE 值,并对此函数的上下文中的每个值进行了说明:表示法“ (DM) ”位于驱动程序管理器返回的 SQLSTATE 说明之前。 与每个 SQLSTATE 值关联的返回代码SQL_ERROR,除非另有说明。
SQLSTATE | 错误 | 说明 |
---|---|---|
01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回 SQL_SUCCESS_WITH_INFO.) |
08S01 | 通信链接失败 | 在函数完成处理之前,驱动程序与所连接的数据源之间的通信链接失败。 |
24000 | 游标状态无效 | 在 StatementHandle 上打开了游标,并且已调用 SQLFetch 或 SQLFetchScroll。 如果 SQLFetch 或 SQLFetchScroll 未返回SQL_NO_DATA,则驱动程序管理器将返回此错误;如果 SQLFetch 或 SQLFetchScroll 已返回SQL_NO_DATA,则驱动程序会返回此错误。 在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll。 |
40001 | 序列化失败 | 由于与另一个事务发生资源死锁,事务已回滚。 |
40003 | 语句完成未知 | 在执行此函数期间,关联的连接失败,并且无法确定事务的状态。 |
HY000 | 常规错误 | 发生错误,其中没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 SQLGetDiagRec 在 *MessageText 缓冲区中返回的错误消息描述了错误及其原因。 |
HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
HY008 | 操作已取消 | 已为 StatementHandle 启用异步处理。 调用了函数,在它完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。 然后,在 StatementHandle 上再次调用函数。 函数已调用,在它完成执行之前,在 StatementHandle 上从多线程应用程序中的不同线程调用 SQLCancel 或 SQLCancelHandle。 |
HY009 | null 指针的使用无效 | TableName 参数为 null 指针。 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, CatalogName 参数为 null 指针, infoType SQL_CATALOG_NAME 返回目录名称受支持。 (DM) SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, SchemaName 或 ColumnName 参数为 null 指针。 |
HY010 | 函数序列错误 | (DM) 为与 StatementHandle 关联的连接句柄调用了异步执行的函数。 调用此函数时,此异步函数仍在执行。 (DM) SQLExecute、 SQLExecDirect 或 SQLMoreResults 已为 StatementHandle 调用并返回SQL_PARAM_DATA_AVAILABLE。 此函数是在检索所有流参数的数据之前调用的。 (DM) 为 StatementHandle 调用了异步执行的函数, (不是此函数) ,在调用此函数时仍在执行。 (DM) SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 已为 StatementHandle 调用,并返回SQL_NEED_DATA。 在针对所有数据执行参数或列发送数据之前调用了此函数。 |
HY013 | 内存管理错误 | 无法处理函数调用,因为无法访问基础内存对象,可能是由于内存不足。 |
HY090 | 无效的字符串或缓冲区长度 | (DM) 其中一个名称长度参数的值小于 0,但不等于SQL_NTS。 |
其中一个名称长度参数的值超过了相应名称的最大长度值。 (请参阅“注释”。) | ||
HY117 | 由于事务状态未知,连接已暂停。 仅允许断开连接和只读函数。 | (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数。 |
HYC00 | 未实现可选功能 | 指定了目录名称,并且驱动程序或数据源不支持目录。 指定了架构名称,驱动程序或数据源不支持架构。 为列名指定了字符串搜索模式,数据源不支持该参数的搜索模式。 驱动程序或数据源不支持SQL_CONCURRENCY和 SQL_CURSOR_TYPE 语句属性的当前设置组合。 SQL_ATTR_USE_BOOKMARKS 语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。 |
HYT00 | 超时时间已到 | 查询超时期限在数据源返回结果集之前过期。 超时期限是通过 SQLSetStmtAttr SQL_ATTR_QUERY_TIMEOUT设置的。 |
HYT01 | 超过连接超时时间 | 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT设置。 |
IM001 | 驱动程序不支持此函数 | (DM) 与 StatementHandle 关联的驱动程序不支持 函数。 |
IM017 | 在异步通知模式下禁用轮询 | 每当使用通知模型时,将禁用轮询。 |
IM018 | 尚未调用 SQLCompleteAsync 来完成此句柄上的上一个异步操作。 | 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后期处理并完成操作。 |
注释
SQLColumnPrivileges 以标准结果集的形式返回结果,按TABLE_CAT、TABLE_SCHEM、TABLE_NAME、COLUMN_NAME和 PRIVILEGE 进行排序。
注意
SQLColumnPrivileges 可能不会返回所有列的特权。 例如,驱动程序可能不会返回有关伪列(如 Oracle ROWID)的权限的信息。 应用程序可以使用任何有效的列,无论它是否由 SQLColumnPrivileges 返回。
表中未显示 VARCHAR 列的长度;实际长度取决于数据源。 若要确定CATALOG_NAME、SCHEMA_NAME、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 。
注意
有关 ODBC 目录函数的常规用法、参数和返回数据的详细信息,请参阅 目录函数。
以下列已重命名为 ODBC 3。x. 列名更改不会影响向后兼容性,因为应用程序按列号绑定。
ODBC 2.0 列 | ODBC 3。x 列 |
---|---|
TABLE_QUALIFIER | TABLE_CAT |
TABLE_OWNER | TABLE_SCHEM |
下表列出了结果集中的列。 驱动程序可以定义列 8 (IS_GRANTABLE) 以外的其他列。 应用程序应通过从结果集末尾倒数(而不是指定显式序号位置)来访问特定于驱动程序的列。 有关详细信息,请参阅 目录函数返回的数据。
列名称 | 列号 | 数据类型 | 注释 |
---|---|---|---|
TABLE_CAT (ODBC 1.0) | 1 | Varchar | 目录标识符;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的目录,但不支持其他表的目录,例如当驱动程序从不同的 DBMS 检索数据时,它将为没有目录的表返回空字符串 (“”) 。 |
TABLE_SCHEM (ODBC 1.0) | 2 | Varchar | 架构标识符;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的架构,但不支持其他表的架构,例如当驱动程序从不同的 DBMS 检索数据时,它会为没有架构的表返回空字符串 (“”) 。 |
TABLE_NAME (ODBC 1.0) | 3 | Varchar 非 NULL | 表标识符。 |
COLUMN_NAME (ODBC 1.0) | 4 | Varchar 非 NULL | 列名称。 驱动程序返回没有名称的列的空字符串。 |
GRANTOR (ODBC 1.0) | 5 | Varchar | 授予权限的用户的名称;如果不适用于数据源,则为 NULL。 对于 GRANTEE 列中的值是对象所有者的所有行,GRANTOR 列将为“_SYSTEM”。 |
GRANTEE (ODBC 1.0) | 6 | Varchar 非 NULL | 向其授予权限的用户的名称。 |
PRIVILEGE (ODBC 1.0) | 7 | Varchar 非 NULL | 标识列特权。 实现定义的) 时,可能是以下 (或数据源支持的其他 (之一: SELECT:允许被授权者检索列的数据。 INSERT:允许被授权者为插入到关联表中的新行中的列提供数据。 UPDATE:允许被授权者更新列中的数据。 引用:允许被授权者引用约束 (中的列,例如唯一、引用或表检查约束) 。 |
IS_GRANTABLE (ODBC 1.0) | 8 | Varchar | 指示是否允许被授权者向其他用户授予权限;“YES”、“NO”或“NULL”(如果未知或不适用于数据源)。 特权要么可授予,要么不可授予,但不能同时授予两者。 SQLColumnPrivileges 返回的结果集永远不会包含除 IS_GRANTABLE 列之外的所有列都包含相同的值的两行。 |
代码示例
有关类似函数的代码示例,请参阅 SQLColumns 函数。
相关函数
有关以下方面的信息 | 请参阅 |
---|---|
将缓冲区绑定到结果集中的列 | SQLBindCol 函数 |
取消语句处理 | SQLCancel 函数 |
返回一个或多个表中的列 | SQLColumns 函数 |
提取数据块或滚动浏览结果集 | SQLFetchScroll Function(SQLFetchScroll 函数) |
提取多行数据 | SQLFetch 函数 |
返回一个或多个表的权限 | SQLTablePrivileges Function(SQLTablePrivileges 函数) |
返回数据源中的表列表 | SQLTables 函数 |