利用您的 Microsoft SQL Server 2000 技能来学习 DB2 UDB V8

内容:
引言
系统结构概述
实例和服务器
Windows 服务
数据库
容器、表空间和文件组
对象名称
表、视图和索引
存储过程、触发器和用户定义函数(UDF)
配置文件
安全性
工具
结束语
下一步该怎么做?
参考资料
关于作者
对本文的评价
订阅:
developerWorks 时事通讯

Raul F. Chong
DB2 Universal Database Consulting Services, IBM Toronto Laboratory
2003 年 7 月

本文向 Microsoft SQL Server 2000 的管理员展示了如何利用您目前的 SQL Server 知识来迅速获得有关 DB2 UDB V8 for Linux、UNIX and Windows 的技能。

引言
在当今的信息技术领域中,新信息在不断地向我们冲击 - 新的软件产品、新的版本和新的功能。使您能跟上这些不断发生的变化的方法之一就是利用您手中 现有的知识。我将向您展示如何使用您目前的 Microsoft® SQL Server 2000 的知识来迅速获得有关 DB2 UDB V8 for Linux、UNIX and Windows 的技能。在本文中,术语“SQL Server”指的是 Microsoft SQL Server 2000,“DB2 UDB” 指的是 DB2 UDB V8 for Linux、UNIX and Windows。本文的重点主要集中在 Windows 平台。

第一个要注意的 SQL Server 和 DB2 UDB 之间的重要区别是 SQL Server 仅在 Windows 平台(Intel 体系结构)上受支持。而另一方面,DB2 UDB 可以在 Linux、UNIX 和 Windows 平台以及许多硬件体系结构中得到支持。针对所有这些平台的代码基本上是相同的,只带有极少数特定于平台的模块。此外,DB2 UDB 产品还可以扩展到 iSeries®(AS/400® 和 z/OS®(大型机))的领域。iSeries 和 z/OS 的 DB2 UDB 成员的代码库与 DB2 UDB for Linux、UNIX and Windows 的不同,因为这些产品利用了各自的硬件体系结构。但是,这些 DB2 系列的功能是非常相似的。在您熟悉了 DB2 UDB for Linux、UNIX and Windows 以后,您可以大胆尝试学习有关其它平台上的 DB2 的更多知识。请参阅参考资料小节以获取有关如何能继续巩固您的技能的更多文章。

系统结构概述
下图 1 展示了基本的 SQL Server 结构。图 2 展示了 DB2 UDB 的结构,请把两者做一下比较。我将在整篇文章中引用这两幅图。

图 1. Microsoft SQL Server 2000 结构
Microsoft SQL Server 2000 结构

图 2. Linux、UNIX 和 Windows 上的 DB2 UDB V8 系统结构
Linux、UNIX 和 Windows 上的 DB2 UDB V8 系统结构

实例和服务器
尽管在 SQL Server 术语中不经常使用“实例”这个术语,但是 实例的概念在 SQL Server 和 DB2 UDB 中是相似的。用户通常只把它称为“服务器”。对于这两个产品而言,实例提供一个独立的环境,数据库对象在其中创建,并且应用程序在这些对象上运行。由于实例遵循一种“不共享”的体系结构,因此一个实例的对象通常不与其它实例的对象进行交互。图 1 和图 2 将 PROD 实例和 DEV 实例表示为两个概念上彼此独立的框。虽然实例的概念在这两个产品中是相同的,但它的实现却是截然不同的。在 SQL Server 中,您可以有一个“缺省”实例(仅有一个)和一些命名实例。 缺省实例在第一次安装 SQL Server 时创建,并由计算机名来标识。而 命名实例在创建 缺省实例之后创建,并必须通过 computer_name//instance_name 的格式来进行标识。

要在同一台机器上创建几个 SQL Server 命名实例,您必须对每个新的实例使用安装 CD,并且对每个新的安装都要使用安装 GUI。请注意,在这个过程中,为每个您创建的实例复制 SQL Server 代码,但使用的路径不同。只有某些文件是实例之间共享的。要删除一个实例,您必须使用安装 GUI 来卸载该实例。

在 DB2 UDB 中,当将产品安装在 Windows 平台后,将缺省地创建“DB2”实例。在 Linux 和 UNIX 中,缺省实例名为“db2instl”。要在同一台机器上创建另一个实例,您只须执行 db2icrt <instance name> 命令。对于一台机器上的多个 DB2 UDB 实例,只有 DB2 UDB 代码的 一个副本。

图 3 显示了 DB2 UDB Control Center GUI 中的缺省 DB2 UDB 实例“DB2”和用 db2icrt 命令创建的其它两个实例。

图 3. 显示 DB2 UDB 实例的 DB2 UDB Control Center GUI
显示 DB2 UDB 实例的 DB2 UDB Control Center GUI

要从命令行接口引用一个给定的 DB2 UDB 实例,请使用 DB2INSTANCE 环境变量。该变量让您指定所有命令将应用到的当前的活动实例。例如,如果 DB2INSTANCE 被设置成 PROD,然后您发出 create database MYDB1 命令,那么您将创建和实例 PROD 关联的数据库。如果您想在实例 DB2 上创建该数据库,则您必须首先将 DB2INSTANCE 变量的值更改为 DB2。

标识您想使用的实例的另一个简单方法是如图 3 所示的使用 DB2 UDB Control Center GUI。您可能必须通过右键单击 Instances并选择 Add来将实例添加到 GUI 中,这样就可以在这个工具中看到该新实例的条目。

在 Windows 中创建了一个 DB2 UDB 实例后,一个与实例名同名的相应服务也被创建。可以执行 db2idrop <instance name> 命令来删除 DB2 实例。该命令 不会除去 DB2 UDB 代码。如果是 Windows 的话,它会除去该实例的相应 Windows 服务。

总而言之,SQL Server 和 DB2 UDB 中的实例在概念上是相同的;不同的是在其实现上。SQL Server 对于每个新实例都需要一个不同的 SQL Server 代码的副本,而 DB2 UDB 则不需要。在 SQL Server 中,可以使用 Enterprise Manager GUI 来管理实例,而在 DB2 UDB 中,则使用 Control Center GUI 来达到类似的目的。

Windows 服务
表 1 描述了一些主要的 DB2 UDB Windows 服务。

表 1. DB2 UDB Windows 服务

服务名 描述
DB2 - <instance name>-<partition number>这是一个给定实例的引擎。它处理所有的 SQL 语句并管理数据库。如果启用了分区支持,DB2 可以支持一个数据库在不同机器上的多个分区。因此,< partition number> 表明您正在处理哪个分区。如果没有启用分区,分区号则不会出现。
DB2 Governor收集连接 DB2 数据库的应用程序的信息,并且基于您定义的规则来监控操作并对一些操作采取行动。例如,您可以指定一条规则将某一工作单元使用的时间限制在一个小时,并且如果超过了这个限制,则强制连接到数据库。
DB2 JDBC Applet Server为使用 JDBC 类型 3 驱动程序的 DB2 应用程序提供 JDBC 服务器支持。
DB2 License Server监控是否符合 DB2 许可证。
DB2 Remote Command Server支持多分区数据库的分区间通信。
DB2 Security Server当在客户机上执行认证时,认证 DB2 数据库用户。
DB2DAS - DB2DAS00这是 DB2 Administration Server。它支持本地的和远程的数据库管理请求。DB2 Administration Server 的 Windows 缺省名称是 DB2DAS00。该服务器与工具目录服务器一起使用来管理作业、警告等。

图 4 显示了带有缺省 DB2 实例以及用 db2icrt 命令创建的 PROD 和 DEV 实例的 DB2 UDB Windows 服务。

图 4. DB2 UDB Windows 服务
DB2 UDB Windows 服务

既然已经理解了 DB2 UDB 使用的 Windows 服务,让我们把这些服务与 SQL Server 上的服务一一对应起来。请看下面的表 2。

表 2. 把 SQL Server Windows 服务映射到 DB2 UDB Windows 服务

SQL Server 服务 匹配的 DB2 UDB Windows 服务
MSSQLServer 服务。这个服务代表了缺省的 SQL Server 实例。DB2 - DB2-0 服务。这个服务代表了缺省的“DB2”实例。
MSSQL$<instance_name>DB2 - <instance_name>
SQLServerAgentDB2DAS - DB2DAS00。这个服务代表了 DB2 Administration Server(DAS)*
SQLAgent$<instance_name>DB2DAS - DB2DAS00。这个服务代表了 DB2 Administration Server(DAS)*
Microsoft Distributed Transaction Coordinator (MS DTC)Sync Point Manager(SPM)用于支持分布式工作单元。数据库配置参数 SPM_NAME 向数据库管理器标识了同步点管理器实例的名称。
Microsoft Search没有匹配的 DB2 UDB Windows 服务;但是,Net Search Extender 软件可用于类似的目的。

* 每台 DB2 机器仅可以有一个 DAS。

数据库
正如图 1 所示,在 SQL Server 中,一个实例可以包含多个数据库。每个数据库都是一个独立的单元;然而,有关所有用户数据库的元数据都保存在 master数据库中,因此查询可以访问两个不同数据库中的表。当创建一个实例的时候,同时也缺省创建了几个数据库,例如 tempdb、master、model 和 Northwind 等等。

SQL Server 采用两个级别来存储元数据:实例级(使用 master 数据库中的系统表)和数据库级(使用用户数据库本身的系统表)。master 和 tempdb 这两个数据库可以被实例中的其它数据库共享。其它例如视图(view)这样的对象在创建用户数据库时也被缺省创建。

正如图 2 所示,在 DB2 UDB 中,一个实例也可以容纳多个数据库,每个数据库是真正封闭、独立的单元。每个数据库都有自己的目录表空间(存储元数据)、临时表空间和用户表空间。但没有一个数据库能够像 SQL Server 中的 master数据库那样可以跨数据库共享元数据信息。同样,也没有数据库能够像 SQL Server 中的 tempdb 那样可以在其它数据库中被共享以保持临时数据。DB2 UDB 包含了一个称作 系统数据库目录的二进制文件,里面有您从 DB2 机器连接的所有数据库的条目。这个目录在实例级别保存。

图 2 显示了 DB2 UDB 中的每个数据库的独立性。此外,您从图中还可以看到每个数据库都有自己的事务日志,这一点与 SQL Server 也很类似。

当创建一个实例时,缺省情况下不创建数据库。您需要使用 create database 命令显式地创建数据库。您也可以使用如图 5 和图 6 所示的 Control Center 来创建数据库。

图 5. 使用 Control Center GUI 创建 DB2 UDB 数据库
使用 Control Center GUI 创建 DB2 UDB 数据库

图 6. 使用 Control Center GUI 创建 DB2 UDB 数据库(续)
使用 Control Center GUI 创建 DB2 UDB 数据库(续)

在图 6 中,您也可以看到当单击了 Show Command时会发生什么情况。所有的 DB2 UDB Control Center GUI 屏幕都会显示实际上在后台执行的 SQL 语句或命令。这些命令能够保存在脚本中以供今后执行,或者被复制并从命令行处理器(Command Line Processor,CLP)工具或 Command Center GUI 工具中执行。这两个工具分别等同于 SQL Server 的 iSQL 和 Query Analyzer。

一个实例内的数据库通常不会相互交互;然而,如果应用程序有这样的要求,那么可以通过启用 联邦(federation)支持来实现此目的。您可以查看 参考资料一节来获取有关联邦的一篇文章。

容器、表空间和文件组
在 DB2 UDB 中, 容器是数据实际存储的地方,并可以分为文件、目录和裸设备。在 SQL Server 中不存在“容器”的概念;而是用文件来存储数据。

在 DB2 UDB 中, 表空间是逻辑对象,用作逻辑表和物理容器之间的层。当创建一个表空间时,您可以将它和一个特定的缓冲池(数据库高速缓存)关联起来,并关联到特定的容器。这给了你管理和性能上的灵活性。例如,如果有一个“热门”的表,您可以在它自身的表空间中定义它,而这个表空间又关联到其自身的缓冲池。这样就帮助确保了该表的数据总是在内存中高速缓存。

当用缺省选项创建 数据库时,将创建三个表空间,如表 3 所述。

表 3. 当创建数据库时,缺省创建的 DB2 UDB 表空间

表空间名称 描述
SYSCATSPACE包含元数据的目录表空间。
TEMPSPACE1用于执行诸如连接和排序操作的系统临时表空间。该表空间的名称可以更改。
USERSPACE1这个表空间是可选的,用于在创建表时没有显式指定表空间的时候存储用户表。

因为数据库是独立的单元,因此不能跨数据库共享表空间。又因为表空间只在一个数据库中是已知的,所以两个不同的数据库可以有同名的表空间。您可以在图 2 中看到,数据库 MYDB1 有一个名为 MYTBLS 的表空间,而数据库 MYDB2 也有一个同名的表空间。

SQL Server 通过与 DB2 UDB 表空间类似的方式来使用文件组。两个不同的数据库可以有同名的文件组,这一点和表空间类似。如图 1 中所显示的,数据库 MYDB1 有一个名为 MyFileGroup 的文件组,而数据库 MYDB2 也有一个同名的文件组。

DB2 UDB 表空间可以被分为 SMS(系统管理空间)或 DMS(数据库管理空间)。SMS 表空间由操作系统管理并仅可以是目录。它们会随着需要自动地增长,因此提供了较好的性能并且不需要太多管理。这与 SQL Server 数据文件的行为(如果您允许自动增长)如出一辙。DMS 表空间由 DB2 UDB 管理,可以是文件或裸设备。这种类型的表空间能获得最佳性能,但需要一定的管理。例如,您需要提前指定希望分配给表空间的空间量,因为增长不是自动进行的。

事务日志的位置和大小可以在数据库 配置文件中指定。

下表 4 显示了 SQL Server 数据库如何与 DB2 UDB 数据库或表空间一一对应。

表 4. SQL Server 数据库如何与 DB2 UDB 数据库或表空间一一对应

SQL Server 数据库 DB2 UDB 数据库或表空间
MasterSYSCATSPACE(目录表空间);在 DB2 UDB 中,仅在数据库级别保存该信息。
model没有等同的数据库/表空间;然而,DB2 提供了一个名为“db2look”的工具,它用来将数据库的结构复制到一个脚本文件以便今后执行它来创建一个新的数据库。
msdb工具目录数据库,它可以在安装时创建,也可以在安装后通过命令 create tools catalog 创建
NorthwindSAMPLE 数据库
pubsSAMPLE 数据库
tempdbTEMPSPACE1 表空间
distributionDB2 UDB 为所有的 DB2 UDB 系列提供内建的复制支持。涉及非 DB2 的关系管理系统的复制需要 Information Integrator 软件。

对象名称
SQL Server 对象名称的结构由四部分组成,如下所示:

    [SQL Server Instance].[Database Name].[Owner].[object name]

请注意:这些名称的头三个部分是可选的,取决于使用对象的上下文。

在 DB2 UDB 中,对象的结构由两部分组成:

    Schema_name.object_name

模式名用来从逻辑上对对象进行分组。模式名不一定和用户标识相匹配。任何具有名为 IMPLICIT_SCHEMA 特权的用户都可以使用不存在的模式创建对象。例如,假设“Peter”具有 IMPLICIT_SCHEMA 特权,并执行了以下命令:

    CREATE TABLE WORLD.TABLEA (lastname char(10))

在这种情况下,创建了表 WORLD.TABLEA,其中 WORLD 是新创建的模式。如果 Peter 没有显式地指明该模式,那么表 PETER.TABLEA 也会被创建,因为缺省使用了连接标识。

在 DB2 UDB 中,在发出命令之前您总是显式地连接至一个数据库,这就解释了为什么数据库名称不是对象名称结构一部分的原因。

表、视图和索引
表、视图和索引在 SQL Server 和 DB2 UDB 中基本上是相同的。就创建 GUI 而言,使用 SQL Server 的 Enterprise Manager GUI 工具时,您必须在创建索引之前创建一个图表,而使用 DB2 UDB Control Center 时,您无需中间步骤就可以直接从 GUI 中创建一个索引。

SQL Server 使用 master 数据库来存储有关其它用户数据库的信息,但是用户数据库本身是独立的单元,就象在 DB2 UDB 中一样。因此,在两种产品中,表、视图或索引都可以在两个不同的数据库中拥有相同的名称。SQL Server 允许连接不同数据库(和 SQL Server)的表;DB2 UDB 仅在显式激活联邦的时候才提供此支持。

存储过程、触发器和用户定义函数(UDF)
本文的主要目的是通过与 SQL Server 环境的比较来描述 DB2 UDB 环境。谈论使用存储过程、触发器和 UDF 的数据库服务器的逻辑是一个相当广泛的话题,因此这里只是简要地介绍一下。

首先,两个产品都支持所有这些对象。只是SQL Server 使用它专有的 Transact-SQL(T-SQL),而 DB2 使用的是 SQL 过程语言(SQL Procedural Language,SQL PL),两者都是 SQL/PSM 标准的扩展。在 SQL Server 中,Transact-SQL 实际应用于每一件事情,包括实现 SQL Server 命令。在 DB2 UDB 中,情况却不是这样。DB2 使用不同的 API 来实现其命令,并且因为 SQL PL 存储过程被首先转换为 C,所以它需要一个 C 编译器来开发这些存储过程。Transact-SQL 是在 SQL Server 引擎中本机执行的一种解释语言。当运行它时,会变成经过解释的字节代码,并在每次运行时都需要优化。存储过程的 C 语言实现可以提供性能优势,因为代码只编译一次(尤其当运行在无保护方式下);然而,它也增添了对 C 编译器的需求。在 DB2 UDB 的未来发行版中,在提供现有功能的基础上,希望能在无需 C 编译器的情况下支持 SQL PL 存储过程,这将允许用户选择他们想要实现 SQL PL 存储过程的方式。

使用 DB2 UDB,您可以在触发器和函数中使用 内联SQL PL,这意味着您不需要 C 编译器。通过这种方法可以支持 SQL PL 语句的一个子集。

配置文件
SQL Server 在实例级别和数据库级别存储它的配置信息。使用 Enterprise Manager GUI,右键单击一个给定的实例或数据库并选择 Properties就可以显示一个带有所有可能配置选项的窗口。在 DB2 UDB 中,配置参数同样存储在实例级别(称为 数据库管理器配置文件)和数据库级(称为 数据库配置文件)。

使用 Control Center,如果右键单击一个给定的实例并选择 Configure Parameters,您将会看到图 7 所示的窗口。

图 7. DB2 UDB 数据库管理器配置参数(实例级别)
DB2 UDB 数据库管理器配置参数(实例级别)

在数据库级别,右键单击一个给定的数据库并选择 Configure Parameters,将显示图 8 所示的窗口。

图 8. 数据库配置参数(数据库级别)
数据库配置参数(数据库级别)

DB2 UDB 提供了许多可以用来配置系统的参数;然而,如果您喜欢用一种简单的方法来自动配置系统,请使用 autoconfigure 命令(或 Configuration Advisor GUI),它根据您提供的一些信息,将数据库管理器和数据库配置参数设置成最佳值。图 9 显示了 Configuration Advisor。

图 9. DB2 UDB Configuration Advisor
DB2 UDB Configuration Advisor

除了配置文件之外,DB2 UDB 通常还把 DB2 注册表变量用于特定于平台的配置。注意, DB2 注册表变量与 Windows 注册表没有任何关系。用户可以使用 db2set 命令来查看并更改这些变量。

安全性
SQL Server 使用认证、角色和特权的概念来实现安全性。

支持两种方式的认证:

  • Windows 认证。
    Windows 操作系统认证登录标识和密码,并仅将登录标识传递给 SQL Server,后者再将这个标识与 sysxlogins 系统表匹配。
  • 混合方式的认证。
    SQL Server 根据它在 sysxlogins 系统表中的信息认证登录标识和密码。

一旦经过认证,用户还不能对 SQL Server 进行任何操作,除非他/她被分配了一个角色或一个给定的特权。 角色被用于将用户分组为一个独立的单元,在这个单元上将应用许可权。因此,您不用将单独的许可权授予几个用户,相反,您可以创建一个包括所有这些许可权的角色,然后再把这个角色分配给用户。

在 DB2 UDB 中,用户不存在于数据库中,而是由操作系统进行管理的。因此,DB2 UDB 的认证在某种程度上有点类似于 SQL Server 的 Windows 认证;但是,在任何数据库表中都不会保存数据库登录信息。任何操作系统用户都有可能潜在地使用 DB2 UDB;然而,除非他们被赋予了给定的 DB2 UDB 权限或特权,否则他们能做的并不是很多。通过 Control Center GUI 可以很方便地处理权限和特权的赋予和撤销。您可能首先必须将一个用户或组从可用的操作系统用户或组中添加到 Control Center。

另外,在 DB2 UDB 中不使用术语“角色”;而是使用术语“权限(authority)”,这类似于 SQL Server 的固定的服务器和数据库角色。DB2 UDB 不支持 MS SQL Server 的用户定义的数据库角色;但是,一个操作系统组可以被赋予权限和特权来实现角色功能。DB2 UDB 支持的权限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。

使用 GRANT SQL 语句不能赋予 SYSADM、SYSCTRL 和 SYSMAINT 权限。这些特殊的权限只能从数据库管理器配置文件来设置。

具有 SYSADM 权限的 DB2 UDB 用户相当于具有 sysadmin 角色的 SQL Server 用户。

DB2 UDB 还使用术语“特权”,这等同于 SQL Server 的许可权。有数据库 特权(connect、createtab 等)和 数据库对象特权(schema、table、view 等)。图 10 显示了从 Control Center GUI 中获得的 DB2 UDB 安全性信息。图中大部分的选项卡对应了 DB2 UDB 所支持的特权。

图 10. DB2 UDB 安全性
DB2 UDB 安全性

下表 5 将 SQL Server 的安全性概念和 DB2 UDB 中的一一对应起来。

表 5. 将 SQL Server 的安全性概念和 DB2 UDB 中的一一对应起来

SQL Server DB2 UDB
两种认证方式:Windows 认证和混合方式认证由操作系统处理的一种认证方式;非常接近于 SQL Server 的 Windows 认证。
角色权限(都是预定义的,没有用户定义的权限。)
许可权特权

工具
我们已经简单地讨论了 SQL Server 和 DB2 UDB 中使用的一些工具;然而,还有许多工具在本文中并没有涉及到。图 11 显示了 DB2 UDB 的菜单。这应该让您对本文中没有讨论到的工具和主题有一个大致的认识。

图 11. DB2 UDB 菜单
DB2 UDB 菜单

使用命令行
如果您更喜欢使用命令行接口,那么对于 SQL Server,您应该习惯使用 iSQL 实用程序。在 DB2 UDB 中的对应接口是命令行处理器(CLP)。

图 12 显示了 DB2 UDB CLP 实用程序。我们首先从命令提示窗口执行命令 db2cmd 来打开命令窗口。这将初始化运行 CLP 所需要的 DB2 环境。然后,我们通过执行命令 db2 来调用 CLP。

图 12. DB2 UDB CLP(命令行处理器)
DB2 UDB CLP (命令行处理器)

SQL Server 和 DB2 UDB 都提供了同样是 GUI 工具的命令行接口。SQL Server 中有 Query Analyzer。而在 DB2 UDB 中对等的是 Command Center,如图 13 所示。

图 13. DB2 UDB Command Center
DB2 UDB Command Center

结束语
本文利用您现有的 Microsoft SQL Server 2000 知识向您介绍了 DB2 UDB V8 for Linux、Windows and UNIX。既然 SQL Server 只受 Windows 平台的支持,因此本文就着重于这个平台;然而,此处所有您学习到的关于 DB2 UDB 的知识(不是很详细)也可以应用于 Linux 和 UNIX 平台。而且,由于使用的是 Windows 平台,所以我们采用了两个产品的 GUI 工具来解释大多数的概念。但是,所有已经解释过的内容都有一个等同的命令。

作为对 SQL Server 和 DB2 UDB 体系结构的最后回顾,让我们比较一下图 14 和图 15。它们分别使用 SQL Server Enterprise Manager 和 DB2 UDB Control Center 显示了各自的数据库对象。

图 14. MS SQL Server Enterprise Manager - 总结
MS SQL Server Enterprise Manager - 总结

图 15. DB2 UDB Control Center - 总结
DB2 UDB Control Center - 总结

下一步该怎么做?
我建议您能查看 “对 DB2 UDB V8 for UNIX、Linux and Windows 的生动简介”这篇文章,它更详细地介绍了本文涵盖的概念。但愿这篇文章给您带来阅读的乐趣并祝您使用 DB2 顺利!

参考资料

关于作者
Raul F. Chong 是 IBM Toronto Laboratory 的数据库顾问,主要与 IBM 业务合作伙伴一起合作。Raul 在 IBM 工作已经有 5 年了,其中 3 年在 DB2 Technical Support 工作,另外 2 年则作为一名专门针对数据库应用程序开发和从其它 RDBMS 迁移到 DB2 UDB 方面的顾问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值