虽然定位更新不适用于所有类型的应用程序,但尽可能使用定位更新和删除。 定位更新(使用 UPDATE WHERE CURRENT OF CURSOR)允许您通过将数据库游标定 位到要更改的行来更新数据,并通知驱动程序更改数据。您不必强制构建复杂的 SQL 语 句;提供要更改的语句。 除了要使代码更易于维护,定位更新通常会提高性能。由于数据库服务器已经在行上定位 (对于当前正在处理 SELECT 语句),因此定位要更改的行的多余查询是不必要的。如果 该行必须定位,则数据库服务器通常具有指向可用行的内部指针(例如 ROWID)。 要支持使用滚动游标定位的 UPDATE 和 DELETE 语句,GBase 8s ODBC Driver 从原始 的定位语句构造一个新的搜索的 UPDATE 或 DELETE 语句。 但是, 数据库服务器不能直 接更新滚动游标。相反,GBase 8s ODBC Driver 会构造一个 WHERE 子句,用于引用在
GBase 8s ODBC Driver 程序员指南 南大通用数据技术股份有限公司 - 197 -
WHERE CURRENT OF CURSOR 子句中引用的 SELECT 语句中访存的每个列。SELECT 语句的行集数据缓存中的值绑定到已经建立的 WHERE 子句中的每个值。 该定位方法比使用具有 FORWARD ONLY 游标的子句 WHERE CURRENT OF CURSOR 子句更慢,更容易出错。如果访存的行不包含唯一键值,则构建的 WHERE 子句可能标识 一行或多行, 这会导致许多行被删除和更新。 以这种方式删除行会影响定位的 UPDATE 和 DELETE 语句,和使用滚动游标的 SQLSetPos 语句。 使用 SQLSpecialColumns 确定在 WHERE 子句中用于更新数据的最佳列集。很多时候, 伪列提供了对数据的最快访问;您只能通过使用 SQLSpecialColumns 确定这些列。 许多应用程序不能设计为利用定位的更新和删除。 这些应用程序通常通过形成 WHERE 子 句来更新数据。该 WHERE 子句由结果集中返回的一部分列值组成。某些应用程序可能会 使用所有可搜索的结果列或通过调用 SQLStatistics 来查找可能属于唯一索引的列的 WHERE 子句。这些方法通常有效,但是会导致相当复杂的查询。 考虑以下示例: rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn, address, city, state, zip FROM emp", SQL_NTS); // fetchdata ⋮ rc = SQLExecDirect (hstmt, "UPDATE EMP SET ADDRESS = ? WHERE first_name = ? AND last_name = ? AND ssn = ? AND address = ? AND city = ? AND state = ? AND zip = ?", SQL_NTS); // fairly complex query 应用程序应该调用 SQLSpecialColumns/SQL_BEST_ROWID 检索标识任何给定记录的最 佳列集(可能是伪列)。许多数据库支持在表定义中没有显式用户定义的特定列,但是是 每个表的隐藏列(例如,ROWID 、TID 和其它列)。这些伪列总是提供对数据的最快访 问。因为它们通常指向记录的确切位置。因为伪列不是显式表定义的一部分,所以它们不 会从 SQLSpecialColumns 返回。确定伪列是否存在的唯一方法是调用 SQLSpecialColumns。
考虑之前的示例,这次使用 SQLSpecialColumns: ⋮ rc = SQLSpecialColumns (hstmt, ..... 'emp', ...); ⋮ rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn, address, city, state, zip, ROWID FROM emp", SQL_NTS); // fetch data and probably "hide" ROWID from the user ⋮ rc = SQLExecDirect (hstmt, "UPDATE emp SET address = ? WHERE ROWID = ?", SQL_NTS); // fastest access to the data!
GS_CLIENT_GLOBAL_KEYS 系统表记录密态等值特性中客户端加密主密钥相关信息, 每条记录对应一个客户端加密主密钥。 名称 类型 描述 oid oid 行标识符(隐含字段)。 global_key_name name 客户端加密主密钥(cmk)名称。 key_namespace oid 包含此客户端加密主密钥(cmk)的命 名空间oid。