2003 年 8 月
一切终于大白于天下!获取应用程序标识并将之用于诸如测试连接这样的目的,以及用于连接合用体系结构中的审计比您所认为的简单。还包含了样本二进制。
本文是为 IBM® DB2® Universal Database™ v8.1 for Linux、UNIX® 和 Windows® 而编写的
重要: 在阅读本文之前请先阅读 免责声明。
简介
客户常常问我们 DB2 中是否有任何会话或应用程序标识的概念,如果有,如何访问它。应用程序可以使用这一信息确定连接的状态,或用于用户修改敏感数据时的审计目的。
唔,有好消息,也有坏消息。好消息是每个至数据库的连接确实都有一个应用程序标识。坏消息是 DB2 不提供轻松检索这个标识的内置 SQL 函数 - 您将需要自己编写一个。编写或构建该函数不难,而且本文的 第 1 部分将向您展示如何快速地这么做。本文的 第 2 部分针对如何使用应用程序标识讨论了一些样本方案。
第 1 部分. 构建一个函数来获取连接的应用程序标识
要构建这个函数,需要安装 DB2 应用程序开发客户机(DB2 Application Development Client)和 C 或 Java 编译器。(如果没有 C 编译器,请参阅 安装二进制文件)。以数据库实例所有者身份(例如, db2inst1 )在服务器本地发出所有命令。
首先,该函数从 DB2 检索到的信息称为应用程序标识。检索到的应用程序标识就是您从 DB2 命令行处理器(Command Line Processor,CLP)发出 LIST APPLICATIONS 时所看到的值:
清单 1. CLP 上 LIST APPLICATIONS 的输出
Auth Id Application Appl. Application Id DB # of Name Handle Name Agents -------- ------------ ------ ------------------------ -------- ----- DB2ADMIN db2bp.exe 5 *LOCAL.DB2.00BE85034416 SAMPLE 1
清单 1 中,第四列表示连接的应用程序标识是 *LOCAL.DB2.00BE85034416 。对于远程连接, *LOCAL 就被替换成客户机机器 IP 地址的十六进制表示。
C 函数
以下 C 函数( 清单 2中)将允许我们检索连接的应用程序标识。
清单 2. 检索连接的应用程序标识的 C 函数
#include <string.h> #include <sqludf.h> void SQL_API_FN getApplicationId( SQLUDF_CHAR *applId, SQLUDF_NULLIND *applId_ind, SQLUDF_TRAIL_ARGS, SQLUDF_DBINFO *dbinfo) { strncpy(applId, dbinfo->appl_id, 128); *applId_ind = 0; }
构建 C 函数
要构建这个函数,需要一个定义库入口点的导出文件。该导出文件根据您平台的不同将有所不同:
- 对于 Windows,该文件被命名为
application_id.def。它显示在 清单 3a 中。清单 3a:Windows 的导出文件(application_id.def)
LIBRARY application_id EXPORTS getApplicationId - 对于 UNIX,该文件的名称应为
application_id.exp。它由单个行组成,显示在 清单 3b 中。清单 3b:UNIX 的导出文件(application_id.exp)
getApplicationId
在放置 C 源代码文件( application_id.c )的目录中创建了这两个文件中的一个(取决于您的平台)后,编译该代码并进行链接。DB2 提供了一个构建例程脚本( bldrtn )来简化这个过程。该脚本位于 sqllib/samples/c 目录。
bldudf ,在 Windows 上请使用 bldmudf 。其调用语法与 V8 中的稍有不同。请查看这些文件,以了解有关如何运行这些构建脚本的细节。 要构建用户定义的函数(UDF),请执行: INSTHOME /sqllib/samples/c/bldrtn application_id 其中, INSTHOME 是实例主目录的路径。例如: c:\\program files\\ibm\\sqllib\\samples\\c\\bldrtn application_id 或 /home/db2inst1/sqllib/samples/c/bldrtn application_id 该脚本将完成两件事: - 编译 UDF 并将其链接到共享库。
- 将产生的共享库(在 UNIX 系统上名为
application_id,而在 Windows 系统上名为application_id.dll)复制到sqllib/function目录
import java.sql.*; import COM.ibm.db2.app.*; public class appl_id extends UDF { public void getApplicationId(String result) throws Exception { try { // set the output parameter based on DBINFO set(1, getDBapplid()); } catch (Exception e) { setSQLstate("38XXX"); if (e.getMessage().length() > 0) { setSQLmessage("Exception '" + e.getMessage() + "' encountered."); } else { setSQLmessage("Exception '" + e.toString() + "' encountered."); } } } } 构建 Java 函数 编译这样简短的 Java 函数很容易完成。使用 Java 编译器 javac 将源文件转换成类文件中的 Java 字节码,然后将该产生的类文件复制到 sqllib/function 目录,如 清单 5所示。请注意,“cp”通常是 UNIX 的复制文件命令,对于 Windows 系统,应该使用“copy”。 清单 5. 编译并安装 Java 函数 javac appl_id.java cp appl_id.class INSTHOME/sqllib/function 安装二进制文件 为了更进一步简化该过程,可以使用从 C 代码预构建的库或由 Java 代码所生成的类文件。 从 C 代码构建的库都命名为 application_id (在 Windows 系统上则是 application_id.






