从一个已有的schema 创建一个结构完全相同的schema。
DB2的一个存储过程,可以帮我们实现这样的功能,它就是
SYSPROC.ADMIN_COPY_SCHEMA, 它的定义结构如下:
- ADMIN_COPY_SCHEMA(
- VARCHAR(128) sourceschema,
- VARCHAR(128) targetschema,
- VARCHAR(128) copymode,
- VARCHAR(128) objectowner,
- CLOB(2M) sourcetbsp,
- CLOB(2M) targettbsp,
- VARCHAR(128) errortabschema,
- VARCHAR(128) errortab
- );
ADMIN_COPY_SCHEMA(
VARCHAR(128) sourceschema,
VARCHAR(128) targetschema,
VARCHAR(128) copymode,
VARCHAR(128) objectowner,
CLOB(2M) sourcetbsp,
CLOB(2M) targettbsp,
VARCHAR(128) errortabschema,
VARCHAR(128) errortab
);
参数的详细解释:
- sourceschema
要copy的源schema
- targetschema
目标schema, 无需已经存在
- copymode
copy的方式,主要有三种,
DDL, 只拷贝对象的定义
COPY, 对象会在新的schema中创建,然后会load(NONRECOVERABLE MODE)数据到新的schema下的对象中。因此在执行完存储过程后需要做一次备份,否则新表无法访问。
COPYNO, 在新的schema创建,然后load(COPYNO MODE)数据到新的schema
- objectowner
新创建对象的owner, 如果为NULL,那么执行COPY的用户将是owner
- sourcetbsp
用于映射新的表空间,这个参数是以逗号隔开的表空间名。如果为NULL,那么所有新的对象都与原有的对象创建于同一个表空间。
- targettbsp
以逗号隔开的列表,当源对象来自sourcetbsp中的一个表空间是,新的copy对象将会创建在targettbsp列表中相应次序的表空间中。
如果为NULL, 与源对象在同一表空间创建。如果为SYS_ANY, 则会用默认的表空间选择算法来选择表空间。
- errortabschema
这是一个[IN OUT]参数,当有对象不能被成功copy时,需要将这些信息存于一张表中作为日志。 这个参数是log表的schema的名称,在SYSTOOLSPACE表空间中。 如果没有这样的记录,作为OUT,这个参数将返回NULL。
- errortab
[IN OUT]参数,log表的名称。 这个表不能创建或已存在,那么存储过程调用将失败,且返回出错信息。表的具体定义见下图:
Sample:
- CALL SYSPROC.ADMIN_COPY_SCHEMA('SOURCE_SCHEMA', 'TARGET_SCHEMA',
- 'COPY', NULL, 'SOURCETS1 , SOURCETS2', 'TARGETTS1, TARGETTS2,
- SYS_ANY', 'ERRORSCHEMA', 'ERRORNAME')
CALL SYSPROC.ADMIN_COPY_SCHEMA('SOURCE_SCHEMA', 'TARGET_SCHEMA',
'COPY', NULL, 'SOURCETS1 , SOURCETS2', 'TARGETTS1, TARGETTS2,
SYS_ANY', 'ERRORSCHEMA', 'ERRORNAME')
- DB2 CALL SYSPROC.ADMIN_COPY_SCHEMA('HUANG','JAY','DDL',NULL,NULL,NULL,'ERRORSCHEMA','ERRORNAME')
下面是测试过程
1、给用户赋予存储过程执行权限。如果赋予完成后,执行CALL语句还是报错,则需要把数据库重启一下。
- CONNECT TO SAMPLE;
- GRANT EXECUTE ON PROCEDURE SYSPROC.ADMIN_COPY_SCHEMA(VARCHAR(),VARCHAR(),VARCHAR(),VARCHAR(),CLOB(),CLOB(),VARCHAR(),VARCHAR()) TO USER ADMIN WITH GRANT OPTION;
- CONNECT RESET;
撤消用以下语句:
- CONNECT TO SAMPLE;
- REVOKE EXECUTE ON PROCEDURE SYSPROC.ADMIN_COPY_SCHEMA(VARCHAR(),VARCHAR(),VARCHAR(),VARCHAR(),CLOB(),CLOB(),VARCHAR(),VARCHAR()) FROM USER ADMIN RESTRICT;
- CONNECT RESET;
2、执行复制命令
- DB2 CALL SYSPROC.ADMIN_COPY_SCHEMA('ADMIN','DB2INST1','COPY',NULL,NULL,NULL,'ERRORSCHEMA','ERRORNAME')
3、复制完成后需要将数据库一次,否则新表无法访问
添加新评论2 条评论
2015-08-24 12:59
2011-03-24 20:32