内容


方便地创建新版本数据库对象

DB2 9 for Linux, UNIX, and Windows 中用来维护模式和修改表的新功能

Comments

模式概念

DB2 中的模式(schema) 是一个命名对象集合,这些对象包括表、视图、昵称、触发器、函数和包。模式提供了数据库中对象的逻辑类别。模式名的最大长度为 30 字节,它用作分两部分的对象名的第一部分。例如,名称 V8R2M5.CUSTOMER。在这个示例中,CUSTOMER 表的完全限定名包含模式名,V8R2M5,这可以在系统编目中将它与其他名为 CUSTOMER 的表区分开。

如果创建对象而且没有指定模式,那么对象使用您的授权 ID 与一个隐式模式相关联(假设用户或组具有 IMPLICIT_SCHEMA 数据库权力)。当 SQL 语句引用对象时,如果没有指定模式名,那么也会隐式地加上调用者的授权 ID。

模式特权

在默认情况下,在创建数据库时,用户组 PUBLIC 被授予 IMPLICIT_SCHEMA 数据库权力。这允许任何用户在还不存在的模式中创建对象。隐式创建的模式允许任何用户在同一个模式中创建其他对象。如果从 PUBLIC 组取消了 IMPLICIT_SCHEMA 权力,那么可以使用 CREATE SCHEMA 语句显式地创建模式;被隐式地授予 IMPLICIT_SCHEMA 权力的用户(比如具有 DBADM 权力的用户)可以隐式地创建模式。

模式具有与其相关联的特权。这使模式所有者能够控制哪些用户有权在这个模式中创建、修改和删除对象(CREATEIN、ALTERIN、DROPIN 特权)。最初,模式所有者拥有这个模式上的所有特权,并能够将这些特权授予其他人。隐式创建的模式由系统(SYSIBM)拥有,所有用户最初都有在这个模式中创建对象的特权。具有 SYSADM 或 DBADM 权力的用户可以改变用户对任何模式的特权,即使模式是隐式创建的。

要想让每个用户能够控制他们自己的数据库对象,数据库管理员可以为每个用户显式地创建一个模式。然后,管理员将模式上所有必需的特权只授予对应的用户。这样其他用户就不能篡改在这个模式中创建的任何对象。为了进一步保护系统,还可以从 PUBLIC 组取消 IMPLICIT_SCHEMA 权力,这样用户就只能通过一个他们具有适当特权的专有模式来创建数据库对象。这种方式使用户能够创建他们需要的任何数据库对象,同时防止他们篡改其他用户创建的数据库对象或者将自己的数据库对象与别人的对象混在一起。

系统模式

对于每个数据库,都创建和维护一组系统编目表。这些表包含关于数据库对象(例如表、视图、索引和包)的定义的信息以及关于用户对这些对象的访问类型的安全信息。这些表存储在 SYSCATSPACE 表空间中,并采用保留的系统模式名:

  • SYSIBM、SYSFUNSYSPROC:一组例程(函数和过程),其中的 SYSIBM 是基本系统编目的模式(不建议直接访问它)。
  • SYSCAT:一组只读的系统编目表视图。
  • SYSSTAT:一组可更新的编目视图。这些可更新的视图允许更新某些统计信息,从而研究假想数据库的性能,或者更新统计信息而不使用 RUNSTATS 实用程序。

设置和获得当前模式

特殊寄存器 CURRENT SCHEMA 包含默认的限定符,用于对特定 DB2 连接中发出的动态 SQL 语句所引用的未限定对象进行限定。它的初始值等于特殊寄存器 USER 中的值(运行时授权 ID)。静态 SQL 语句(在默认情况下)由绑定应用程序的用户的授权 ID 进行限定。用户可以使用 SET CURRENT SCHEMA 语句修改特殊寄存器 CURRENT SCHEMA 的值。

可以用 VALUES CURRENT SCHEMASELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1 命令获得当前的模式名。

清单 1. 使用模式的示例

示例 1:授权 ID = HRUSER01,IMPLICIT_SCHEMA 权力

命令结果
CREATE TABLE TEST1 (ID INT, NAME VARCHAR(25))Table HRUSER01.TEST1 created
CREATE TABLE V8R2M5.TEST1 (ID INT, NAME VARCHAR(25))Table V8R2M5.TEST1 created
SET CURRENT SCHEMA='V8R2M5'CURRENT SCHEMA special register set to V8R2M5
INSERT INTO TEST1 VALUES(1,'John Doe')Data inserted into table V8R2M5.TEST1

示例 2:授权 ID = HRUSER01,没有 IMPLICIT_SCHEMA 权力

命令结果
CREATE TABLE TEST1 (ID INT, NAME VARCHAR(25))SQL0552N "HRUSER01" does not have the privilege to perform operation "IMPLICIT CREATE SCHEMA". SQLSTATE=42502
CREATE TABLE HRUSER01.TEST1 (ID INT, NAME VARCHAR(25))SQL0552N "HRUSER01" does not have the privilege to perform operation "IMPLICIT CREATE SCHEMA". SQLSTATE=42502
CREATE SCHEMA HRUSER01 AUTHORIZATION HRUSER01Schema HRUSER01 created
CREATE TABLE TEST1 (ID INT, NAME VARCHAR(25))Table HRUSER01.TEST1 created

删除模式

DROP SCHEMA 模式名 RESTRICT 命令删除模式。在删除模式之前,必须先删除这个模式中的所有对象,或者将它们转移到另一个模式中。RESTRICT 关键字要求在要从数据库中删除的模式中不能定义对象,必须指定这个关键字。

与模式相关的系统编目信息

有两个系统编目视图可以用来获得数据库中所有模式的信息:SYSCAT.SCHEMATA 和 SYSCAT.SCHEMAAUTH。

表 1. SYSCAT.SCHEMATA 编目视图
列名数据类型描述
SCHEMANAMEVARCHAR(128)模式的名称
OWNERVARCHAR(128)有权删除这个模式和其中所有对象的用户的授权 ID
DEFINERVARCHAR(128)创建这个模式的用户的授权 ID
CREATE_TIMETIMESTAMP创建这个模式的时间
REMARKSVARCHAR(254)用户提供的注释,或者是空的
表 2. SYSCAT.SCHEMAAUTH 编目视图
列名数据类型描述
GRANTORVARCHAR(128)特权的授予者
GRANTEEVARCHAR(128)特权的持有者
GRANTEETYPECHAR(1)G = 被授予者是一个组,U = 被授予者是一个单独的用户
SCHEMANAMEVARCHAR(128)应用这个特权的模式的名称
ALTERINAUTHCHAR(1)对命名模式中的对象进行修改或注释的特权:G = 持有且可以授予别人,N = 不持有,Y = 持有
CREATEINAUTHCHAR(1)在命名模式中创建对象的特权:G = 持有且可以授予别人,N = 不持有,Y = 持有
DROPINAUTHCHAR(1)从命名模式中删除对象的特权:G = 持有且可以授予别人,N = 不持有,Y = 持有
清单 2. 系统编目查询示例
命令 描述
SELECT SCHEMANAME FROM SYSCAT.SCHEMATA WHERE SCHEMANAME NOT IN ('SYSIBM','SYSFUN','SYSCAT','SYSSTAT','NULLID','SYSPROC','SQLJ','SYSTOOLS')获得不是由系统定义的模式名
SELECT S.SCHEMANAME, S.OWNER, A.GRANTOR, A.GRANTEE FROM SYSCAT.SCHEMATA S, SYSCAT.SCHEMAAUTH A WHERE S.SCHEMANAME=A.SCHEMANAME AND S.SCHEMANAME NOT IN ('SYSIBM','SYSFUN','SYSCAT','SYSSTAT','NULLID','SYSPROC','SQLJ','SYSTOOLS')从不是由系统定义的模式获得关于 SCHEMANAME、OWNER、GRANTOR 和 GRANTEE 的信息
SELECT TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA='SCHEMAWS'获得具有模式名 ‘SCHEMAWS’ 的所有表名

场景示例

为了说明 DB2 9 for Linux, UNIX, and Windows 中的新功能(这些功能可以大大简化创建数据库对象的新版本和修改表的过程),假设有以下场景:

由于几家银行的合并,数据库数据模型需要进行一些显著的修改:

  • 表 ACCOUNT 必须增加一个 Managing_Bank 列。
  • TRANSACTION 表中的 Instruction_ID 列已经没用了,将被删除。
  • ACCOUNT 和 TRANSACTION 表中的 Account_ID 列的数据类型必须从 SMALLINT 改为 INTEGER。
  • ACCOUNT 表中的 Credit_Line 列的 NOT NULL 属性必须删除,这是因为添加了没有信用行的其他账号类型。
  • TRANSACTION 表中的 Description 列的大小必须增加。
图 1. 银行合并数据模型
银行合并数据模型
银行合并数据模型

首先,将当前用模式名 V8R2M5 创建的所有数据库对象复制到同一数据库中新的开发版本 V9R0M0 中。然后,按照上面的描述修改表列的定义,并用新的修改测试银行解决方案。最后,将新的提交版本复制到新的数据库并命名为 V9R1M0,在开发数据库中删除已经废弃的模式 V8R2M5。

ADMIN_COPY_SCHEMA 过程

ADMIN_COPY_SCHEMA 过程用来在同一数据库中复制特定的模式和其中包含的所有对象。使用与源模式中对象相同的对象名来创建新的目标模式对象,但是采用目标模式限定符。ADMIN_COPY_SCHEMA 过程可以用来复制表,此时可以装载源表的数据,也可以不装载。

清单 3. ADMIN_COPY_SCHEMA 过程的语法
>>-ADMIN_COPY_SCHEMA--(--sourceschema--,--targetschema--,------->
>--copymode--,--objectowner--,--sourcetablespace--,--sourcetablespace--,---->
>--errortabschema--,--errortab--)------------------------------><

有三个用于指定复制方式的选项:

  • 'DDL':创建源模式中支持的所有对象的空副本。
  • 'COPY':创建源模式中所有对象的空副本,然后用数据填充每个目标模式表。数据装载以 ‘NONRECOVERABLE’ 方式进行。在调用 ADMIN_COPY_SCHEMA 之后必须进行备份,否则在恢复以后复制的表将不可访问。
  • 'COPYNO':创建源模式中所有对象的空副本,然后用数据填充每个目标模式表。数据装载以 ‘COPYNO’ 方式进行。

Errortabschema 指定错误表的模式名,这个表包含无法复制的对象的错误信息。ADMIN_COPY_SCHEMA 过程在 SYSTOOLSPACE 表空间中替用户创建这个表。如果没有发生错误,那么这个参数在输出上是 NULL。

Errortab 指定错误表的名称,这个表包含无法复制的对象的错误信息。这个表由调用过程的用户 ID 拥有。如果没有发生错误,那么这个参数在输出上是 NULL。

表 3. ADMIN_COPY_SCHEMA 错误表格式
列名数据类型描述
OBJECT_SCHEMAVARCHAR(128)无法执行复制命令的对象的模式名
OBJECT_NAMEVARCHAR(128)无法执行复制命令的对象的名称
OBJECT_TYPEVARCHAR(30)对象的类型
SQLCODEINTEGER错误的 SQLCODE
SQLSTATECHAR(5)错误的 SQLSTATE
ERROR_TIMESTAMPTIMESTAMP操作失败的时间
STATEMENT CLOB(2 M)操作失败的对象的数据定义语言(DDL)。如果在将数据装载到目标表中的时候发生失败,那么这个字段包含与失败的装载命令对应的文本
DIAGTEXTCLOB(2 K)失败的操作的错误消息文本

ADMIN_COPY_SCHEMA 过程的输出

如果 ADMIN_COPY_SCHEMA 过程成功地执行了,那么返回状态码 0。但是,如果任何对象没有成功地复制,那么错误消息被写入错误表,而且在输出中显示 Errortabschema 和 Errortab 的名称。

清单 4. 成功地执行 ADMIN_COPY_SCHEMA 过程,指定的所有对象都成功地复制了
  CALL SYSPROC.ADMIN_COPY_SCHEMA
    ('V8R2M5', 'V9R0M0', 'DDL', NULL, NULL, NULL, 'COPYSCHEMA', 'COPYERROR')
    
  Value of output parameters
  --------------------------
  Parameter Name  : ERRORTABSCHEMA
  Parameter Value : - 

  Parameter Name  : ERRORTABNAME
  Parameter Value : - 

  Return Status = 0
清单 5. 成功地执行 ADMIN_COPY_SCHEMA 过程,但是在复制对象时发生了错误
  CALL SYSPROC.ADMIN_COPY_SCHEMA
    ('V8R2M5', 'V9R0M0', 'DDL', NULL, NULL, NULL, 'COPYSCHEMA', 'COPYERROR')
    
  Value of output parameters
  --------------------------
  Parameter Name  : ERRORTABSCHEMA
  Parameter Value : COPYSCHEMA 

  Parameter Name  : ERRORTABNAME
  Parameter Value : COPYERROR

  Return Status = 0

授权

为了成功地进行模式复制,调用这个过程的用户 ID 必须具有适当的对象创建权力,包括从源表进行选择的权力和执行数据装载的权力。

限制和使用说明

  • 这个过程不支持复制以下对象:
    • 索引扩展
    • 昵称
    • 有类型的表
    • 用户定义的结构化类型(及其转换函数)
    • 有类型的视图
    • Java 例程存档(JARS)
    • 分段表
  • 不支持复制包含 XML 列的表的模式。
  • 对于高可用性灾难恢复(HADR)数据库,只支持 DDL 复制方式。
  • 不修改复制的对象中的限定对象。ADMIN_COPY_SCHEMA 过程只修改创建的对象的模式,而不修改这些对象中的任何数据。
  • 在对复制的(replicated)表进行复制时,表的新副本没有启用订阅。表只作为基本表重新创建。
  • 为每个外部例程创建一个新的编目项,它们引用源例程的二进制代码。
  • 目标模式中对象的统计信息设置为默认值。
  • 如果表包含生成的标识列,而且复制方式是 ‘COPY’ 或 ‘COPYNO’,那么在装载期间保留源表的数据值。
  • 如果在复制操作开始时表处于 set integrity pending 状态,那么数据不会装载到目标表中。
  • 在 DDL 重新执行期间,如果默认模式与源模式匹配,那么它被改为目标模式。
  • 用来编译触发器、视图或 SQL 函数的函数路径就是用来创建源对象的路径,但是有一个例外:如果对象的函数路径包含源模式名,那么在 DDL 重新执行期间路径中的这一部分被修改为目标模式名。
  • 使用带 COPYNO 选项的 ADMIN_COPY_SCHEMA 过程会使目标数据库对象所在的表空间进入 backup pending 状态。在装载操作完成之后,目标模式表处于 set integrity pending 状态,ADMIN_COPY_SCHEMA 过程会执行一个 SET INTEGRITY 语句使表脱离这种状态。因为表空间已经处于 backup pending 状态,所以 SET INTEGRITY 语句会失败。
  • 运行多个 ADMIN_COPY_SCHEMA 过程会导致死锁。每次只应该执行一个 ADMIN_COPY_SCHEMA 过程调用。在复制处理期间修改源模式中的表可能会导致在复制操作之后目标模式中的数据不相同。
  • 这个过程的操作要求 SYSTOOLSPACE 表空间已经存在。这个表空间用来容纳 ADMIN_COPY_SCHEMA 过程所使用的元数据以及这个过程返回的错误表。

SYSTOOLSPACE

SYSTOOLSPACE 表空间是一个用户数据表空间,DB2 管理工具和一些 SQL 管理例程使用它存储历史数据和配置信息。对于大多数工具,会在第一次使用时创建它,但是对于 ADMIN_COPY_SCHEMA 和 ADMIN_DROP_SCHEMA 过程不会自动创建它。

清单 6. 定义使用自动存储的 SYSTOOLSPACE
CREATE TABLESPACE SYSTOOLSPACE IN IBMCATGROUP
MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 4
清单 7. 定义不使用自动存储的 SYSTOOLSPACE
CREATE TABLESPACE SYSTOOLSPACE IN IBMCATGROUP 
MANAGED BY DATABASE USING ( FILE 'SYSTOOLSPACE' 32 M ) 
 AUTORESIZE YES EXTENTSIZE 4

使用示例

CALL SYSPROC.ADMIN_COPY_SCHEMA
('V8R2M5', 'V9R0M0', 'DDL', NULL, NULL, NULL, 'COPYSCHEMA', 'COPYERROR')

只有模式 V8R2M5 中的对象被复制到源表空间中的模式 V9R0M0 中,原来的对象所有者保持不变。如果发生错误,对于每个错误,在表 COPYSCHEMA.COPYERROR 中写入一项。

CALL SYSPROC.ADMIN_COPY_SCHEMA
('V8R2M5', 'V9R0M0', 'COPY', NULL, NULL, NULL, 'COPYSCHEMA', 'COPYERROR')

模式 V8R2M5 中的对象和包含的数据被复制到源表空间中的模式 V9R0M0 中,原来的对象所有者保持不变。

CALL SYSPROC.ADMIN_COPY_SCHEMA
('V8R2M5', 'V9R1M0', 'COPY', 'V9_ADMIN', 
'USERSPACE1', 'V9_USERSPACE1,SYS_ANY', 'COPYSCHEMA', 'COPYERROR')

模式 V8R2M5 中的对象和包含的数据被复制到模式 V9R0M0 中,并指定新的对象所有者 V9_ADMIN。来自表空间 USERSPACE1 的对象被复制到表空间 V9_USERSPACE1 中,其他表空间使用默认的表空间选择算法。

修改表

在 DB2 9 for Linux, UNIX, and Windows 上,ALTER TABLE 语句已经做了改进,现在可以用来执行以下操作:

  • 使用新的 DROP COLUMN 子句删除列。
  • 使用 ALTER COLUMN SET DATA TYPE 子句修改列类型。
  • 使用 SET NOT NULL 或 DROP NOT NULL 子句修改列的可空属性。

在使用 SQL 修改这些表属性时,不再需要删除表并重新创建它。这原来是一个很耗费时间的过程,而且在存在对象依赖时可能会很复杂。

对于这个示例,ALTER TABLE 语句将执行以下步骤:

清单 8. 将 Managing_Bank 列添加到 ACCOUNT 表中
ALTER TABLE V9R0M0.ACCOUNT ADD COLUMN Managing_Bank VARCHAR(15)

注意:这个特性在 DB2 Universal Database Version 8 中就已经可用了。

清单 9. 删除 TRANSACTION 表中的 Instruction_ID 列
ALTER TABLE V9R0M0.TRANSACTION DROP COLUMN Instruction_ID
清单 10. 将 ACCOUNT 和 TRANSACTION 表中的 Account_ID 列的数据类型从 SMALLINT 改为 INTEGER
ALTER TABLE V9R0M0.ACCOUNT ALTER COLUMN Account_ID SET DATA TYPE INTEGER
ALTER TABLE V9R0M0.TRANSACTION ALTER COLUMN Account_ID SET DATA TYPE INTEGER
清单 11. 删除 ACCOUNT 表中的 Credit_Line 列的 NOT NULL 属性
ALTER TABLE V9R0M0.ACCOUNT ALTER COLUMN Credit_Line DROP NOT NULL
清单 12. 增加 TRANSACTION 表中的 Description 列的大小
ALTER TABLE V9R0M0.TRANSACTION ALTER COLUMN Description SET DATA TYPE VARCHAR (60)

注意:这个特性在 DB2 Universal Database Version 8 中就已经可用了。

DROP COLUMN 的限制和使用说明

  • 表必须不是有类型表(SQLSTATE 428DH)。
  • 表不能启用数据捕捉(SQLSTATE 42997)。
  • 删除列之后要求进行表重组,然后才允许进行进一步的表访问。
表 4. 删除列的级联效果
操作RESTRICT 关键字CASCADE 关键字
删除视图或触发器所引用的列不允许删除这个列这个对象和依赖于这个对象的所有对象都被删除
删除索引的键中引用的列如果在同一个 ALTER TABLE 语句中删除索引中引用的所有列,那么允许删除索引。否则,不允许删除列删除索引
删除惟一性约束中引用的列如果在同一个 ALTER TABLE 语句中删除惟一性约束中引用的所有列,而且这个惟一性约束没有被引用约束引用,那么删除列和约束。(用来满足这个约束的索引也被删除。)否则,不允许删除列惟一性约束和引用这个惟一性约束的引用约束都被删除(这些约束使用的索引也被删除)
删除引用约束中引用的列如果在同一个 ALTER TABLE 语句中删除引用约束中引用的所有列,那么删除列和约束。否则,不允许删除列删除引用约束
删除一个未被删除的系统生成列所引用的列不允许删除这个列不允许删除这个列
删除检查约束中引用的列不允许删除这个列删除检查约束
删除一个启用了分解的 XSROBJECT(XML 模式存储库对象)中引用的列不允许删除这个列这个 XSROBJECT 被标为对分解失效。可能需要重新调整映射才能重新启用这个 XSROBJECT。在此之后,对这个 XSROBJECT 执行 ALTER XSROBJECT ENABLE DECOMPOSITION 语句

SET DATA TYPE 的限制和使用说明

  • 不能修改标识列的数据类型(SQLSTATE 42997)。
  • 表不能启用数据捕捉(SQLSTATE 42997)。
  • 指定的长度、精度或刻度可以大于或等于(但是不能小于)现有的长度、精度或刻度(SQLSTATE 42837)。
  • 对列的修改不能导致所有列的总字节数超过记录的最大大小(SQLSTATE 54010)。如果惟一性约束或索引中使用这个列,那么新的长度不能导致惟一性约束或索引的总存储长度超过页的索引键长度限制(SQLSTATE 54008)。
  • 新的数据类型必须与列的现有数据类型兼容(SQLSTATE 42837)。表 5 列出了兼容的数据类型。“需要重组” 列表示这种数据类型修改是否要求在访问表之前进行表重组(SQLSTATE 57016)。在需要表重组的情况下,被修改的列不能属于包含 XML 数据类型列的表(SQLSTATE 42997)。
表 5. 兼容的数据类型
源类型目标类型需要重组
SMALLINT INTEGERyes
SMALLINTBIGINTyes
SMALLINTDECIMAL (p, m); p-m > 4yes
SMALLINTREALyes
SMALLINTDOUBLEyes
INTEGERBIGINTyes
INTEGERDECIMAL (p, m); p-m > 9yes
INTEGERDOUBLEyes
BIGINTDECIMAL (p, m); p-m > 19yes
REALDOUBLEyes
DECIMAL (n, m)DECIMAL (p, q); p >= n; q >= m; (p-q) >= (n-m)yes
CHARACTER (n)CHARACTER (n+x)yes
CHARACTER (n)VARCHAR (n+x)yes
VARCHAR (n)CHARACTER (n+x)yes
VARCHAR (n)VARCHAR (n+x)no
GRAPHIC (n)GRAPHIC (n+x)yes
GRAPHIC (n)VARGRAPHIC (n+x)yes
VARGRAPHIC (n)VARGRAPHIC (n+x)no
VARGRAPHIC (n)GRAPHIC (n+x)yes
BLOB (n)BLOB (n+x)no
CLOB (n)CLOB (n+x)no
DBCLOB (n)DBCLOB (n+x)no

DROP NOT NULL 的限制和使用说明

  • 如果表的主键或惟一性约束中指定了这个列,那么不允许使用这个子句(SQLSTATE 42831)。
  • 表不能启用数据捕捉(SQLSTATE 42997)。
  • 修改列的这个属性要求进行表重组,然后才允许进行进一步的表访问(SQLSTATE 57016)。
  • 被修改的列不能属于包含 XML 数据类型列的表(SQLSTATE 42997)。

带 COPY 操作的 DB2MOVE 实用程序

在这个示例场景中,V9R0M0 模式中的数据库修改成功地通过了测试,下面要把新的提交版本复制到一个新数据库并命名为 V9R1M0 模式。

清单 13. 带 COPY 操作的 DB2MOVE 实用程序的语法
>>-db2move--dbname--COPY----+------------------------+-+----->< 
                                  +- -sn--schema-names-----+
                                  +- -tn--table-names------+
                                  +- -tf--filename---------+
                                  +- -co--copy-option------+
                                  +- -u--userid------------+
                                  +- -p--password----------+

在使用带 COPY 操作的 DB2MOVE 实用程序时,可以在 -co 后面使用以下选项:

  • TARGET_DB <db name> [USER <userid> USING <password>] 允许用户指定目标数据库的名称以及用户和口令。(可以使用 -p 和 -u 选项指定源数据库的用户和口令。)USER 或 USING 子句是可选的。如果 USER 指定一个用户 ID,那么必须在 USING 子句中提供口令;如果没有指定口令,那么 DB2MOVE 会提示输入口令。出现这个提示是由于下面讨论的安全原因。TARGET_DB 是 COPY 操作的必要选项。TARGET_DB 不能与源数据库相同。COPY 操作要求至少输入一个模式(-sn)或一个表(-tn 或 -tf)。
  • MODE
    • DDL_AND_LOAD:从源模式创建支持的所有对象,并用源表数据填充表。这是默认选项。
    • DDL_ONLY:从源模式创建支持的所有对象,但是不重新填充表。
    • LOAD_ONLY:将指定的所有表从源数据库装载到目标数据库中。这些表必须已经在目标数据库中存在。
  • SCHEMA_MAP 允许用户在向目标数据库进行复制时对模式重新命名。需要提供一个源-目标模式映射列表,映射由括号包围,由逗号分隔。例如,schema_map ((s1, t1), (s2, t2))。这意味着把模式 s1 中的对象复制到目标数据库中的模式 t1 中,把模式 s2 中的对象复制到目标数据库中的模式 t2 中。默认的目标模式名与源模式名相同,这也是推荐的做法。这是因为 DM2MOVE 不会尝试修改对象体中的任何限定对象的模式。因此,如果对象体中有限定对象,那么不同的目标模式名就可能导致问题。
  • NONRECOVERABLE 这个选项允许用户改变 COPY-NO 装载操作的默认行为。在采用默认行为时,用户必须对进行装载的每个表空间进行备份。如果指定这个 NONRECOVERABLE 关键字,那么用户不必马上对表空间进行备份。但是,强烈建议尽快进行备份,从而确保新创建的表可以正确地恢复。
  • OWNER 允许用户在成功的 COPY 操作之后修改在目标模式中创建的每个新对象的所有者。目标对象默认的所有者是进行连接的用户。如果指定这个选项,那么所有者就改为新的所有者。
  • TABLESPACE_MAP 用户可以指定在复制期间使用的表空间名映射,而不使用来自源数据库的表空间。在这里应该提供一个表空间映射数组,映射由括号包围。例如,tablespace_map ((TS1, TS2),(TS3, TS4))。这意味着把表空间 TS1 中的所有对象复制到目标数据库中的表空间 TS2 中,把表空间 TS3 中的对象复制到目标数据库中的表空间 TS4 中。如果是 ((T1, T2),(T2, T3)),那么源数据库中 T1 中的所有对象在目标数据库中的 T2 中重新创建,源数据库中 T2 中的所有对象在目标数据库中的 T3 中重新创建。在默认情况下,使用与源数据库相同的表空间名,在这种情况下,不必提供这个表空间的映射。如果指定的表空间不存在,那么使用这个表空间的对象复制操作会失败,这一情况会记录在错误文件中。

    用户还可以使用 SYS_ANY 关键字,这表示应该使用默认的表空间选择算法来选择表空间。在这种情况下,DB2MOVE 可以选择任何可用的表空间作为目标表空间。SYS_ANY 关键字可以用于所有表空间。例如,tablespace_map SYS_ANY。另外,用户可以为某些表空间指定特定的映射,而对其他表空间使用默认的表空间选择算法。例如,tablespace_map ((TS1, TS2),(TS3, TS4), SYS_ANY)。这表示表空间 TS1 映射为 TS2,TS3 映射为 TS4,而其他表空间将使用默认的表空间目标。使用 SYS_ANY 关键字是因为表空间名称不可能以 “SYS” 开头。

限制和使用说明

  • DB2MOVE 实用程序尝试复制所有允许的模式对象,但是以下类型的对象除外:
    • 表层次结构
    • 分段表(在多分区数据库环境中装载实用程序不支持这种表)
    • Java 例程存档(JARS)
    • 昵称
    • 视图层次结构
    • 对象特权(创建的所有新对象都具有默认的授权)
    • 统计信息(新对象不包含统计信息)
    • 索引扩展(与用户定义的结构化类型相关)
    • 用户定义的结构化类型及其转换函数
  • 在复制处理期间修改源模式中的表可能会导致在复制操作之后目标模式中的数据不相同。
  • 对于不与模式相关的对象(比如表空间和事件监视器),在模式复制操作期间不进行处理。
  • 在对复制的(replicated)表进行复制时,表的新副本没有启用订阅。表只作为常规表重新创建。
  • 如果源数据库和目标数据库不在同一个实例中,那么必须对源数据库进行编目。
  • 运行多个 DB2MOVE 命令将模式从一个数据库复制到另一个数据库会导致死锁。每次应该只执行一个 DB2MOVE 命令。

使用示例

db2move BANKDEV COPY -sn V9R0M0 -co TARGET_DB BANKSHIP USER USER develop01 USING dev01pwc 
           MODE DDL_ONLY SCHEMA_MAP ((V9R0M0,V9R1M0))

只将模式 V9R0M0 中的对象从源数据库 BANKDEV 复制到目标数据库 BANKSHIP 中的模式 V9R1M0 中。

db2move BANKDEV COPY -sn V9R0M0 -co TARGET_DB BANKSHIP USER USER develop01 USING dev01pwc 
           SCHEMA_MAP ((V9R0M0,V9R1M0))

将模式 V9R0M0 中的对象和包含的数据从源数据库 BANKDEV 复制到目标数据库 BANKSHIP 中的模式 V9R1M0 中。

db2move BANKDEV COPY -sn V9R0M0 -co TARGET_DB BANKSHIP USER USER develop01 USING dev01pwc 
           SCHEMA_MAP ((V9R0M0,V9R1M0)) OWNER V9_ADMIN 
           TABLESPACE_MAP ((USERSPACE1,V9_USERSPACE1),(USERSPACE2,V9_USERSPACE2),SYS_ANY)

将模式 V9R0M0 中的对象和包含的数据复制到模式 V9R1M0 中,并指定新的对象所有者 V9_ADMIN。将表空间 USERSPACE1 中的对象复制到表空间 V9_USERSPACE1 中。将表空间 USERSPACE2 中的对象复制到表空间 V9_USERSPACE2 中。其他表空间使用默认的表空间选择算法。

带 COPY 操作的 DB2MOVE 实用程序生成的文件

  • COPYSCHEMA.timestamp.msg:DB2MOVE COPY 操作产生的消息。
  • COPYSCHEMA.timestamp.err:DB2MOVE COPY 操作产生的错误(只在发生错误的情况下生成这个文件)。
  • LOADTABLE.timestamp.msg:DB2MOVE COPY 操作中 LOAD 操作产生的消息(MODE DDL_AND_LOAD 和 LOAD_ONLY)。
  • LOADTABLE.timestamp.err:DB2MOVE COPY 操作中 LOAD 操作产生的错误(只在发生错误的情况下生成这个文件)。
清单 14. 成功执行带 COPY 操作的 DB2MOVE 实用程序所产生的消息
Application code page not determined, using ANSI codepage 1252

*****  DB2MOVE  *****
Action:  COPY
Start time:  Mon Jun 12 17:46:39 2006

All schema names matching:  V9R0M0; 
Connecting to database BANKDEV ... successful!  Server : DB2 Common Server V9.0.0
Copy schema V9R0M0 to V9R1M0 on the target database BANKSHIP
Create DMT :  "SYSTOOLS"."DMT_448d83d5c76c"

db2move finished successfully

Files generated:
-----------------
COPYSCHEMA.20060612174639.msg
LOADTABLE.20060612174639.MSG
Please delete these files when they are no longer needed.

End time:  Mon Jun 12 17:46:43 2006
清单 15. 不成功地执行带 COPY 操作的 DB2MOVE 实用程序所产生的消息
Application code page not determined, using ANSI codepage 1252

*****  DB2MOVE  *****
Action:  COPY
Start time:  Mon Jun 12 17:04:57 2006

All schema names matching:  V9R0M0; 
Connecting to database BANKDEV ... successful!  Server : DB2 Common Server V9.0.0
Copy schema V9R0M0 to V9R1M0 on the target database BANKSHIP
Create DMT :  "SYSTOOLS"."DMT_448d829c49bdd"

Rolled back all changes from the create phase (debuginfo:140).

db2move failed with -1 (debuginfo:220).

Files generated:
-----------------
COPYSCHEMA.20060612170457.msg
COPYSCHEMA.20060612170457.ERR

Please delete these files when they are no longer needed.

**Error occurred -1

End time:  Mon Jun 12 17:05:01 2006


Content of file COPYSCHEMA.20060612170457.ERR:

1 Schema        : V9R0M0  .TEST
  Type          : TABLE
  Error Msg     : [IBM][CLI Driver][DB2/NT] SQL0204N
  "USERSPACE2" is an undefined name. SQLSTATE=42704

  DDL           : 
 CREATE TABLE "V9R1M0  "."TEST" (
		  "COL1" INTEGER ) 
 	 	 IN "USERSPACE2"

ADMIN_DROP_SCHEMA 过程

ADMIN_DROP_SCHEMA 过程用于删除特定的模式以及其中包含的所有对象。

使用说明

  • 如果另一个模式中的对象依赖于被删除的对象,那么应用默认的 DROP 语句语义。
  • 不支持的对象与 ADMIN_COPY_SCHEMA 过程相同,而且也要求 SYSTOOLSPACE 表空间已经存在。

在这个示例场景中,新的提交版本已经成功地复制到了新数据库中的模式 V9R1M0 中。现在可以使用 ADMIN_DROP_SCHEMA 过程从开发数据库中删除废弃的模式 V8R2M5:

CALL SYSPROC.ADMIN_DROP_SCHEMA
   ('V8R2M5', NULL, 'COPYSCHEMA', 'COPYERROR')

结束语

DB2 9 for Linux, UNIX, and Windows 中的新特性,比如 ADMIN_COPY_SCHEMA 过程、ADMIN_DROP_SCHEMA 过程和带 COPY 操作的 DB2MOVE 实用程序,大大简化了在同一数据库或另一个目标数据库中复制和维护数据库模式及其相关数据库对象的过程。再结合使用对 ALTER TABLE 语句的改进,就可以方便地管理数据库解决方案的不同版本。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=166489
ArticleTitle=方便地创建新版本数据库对象
publish-date=10092006