整理自:http://www.orapub.cn/posts/3296.html
http://oracleseeker.com/2009/09/29/about_xml_object_description_file_xdf_of_oracle_database_objects_migration_tool/
Oracle EBS二次开发中,往往会创建很多数据库对象,如表、同义词、视图等,这些数据库对象是二次开发配置管理内容很重要的一部分,通常情况下我们会使用脚本文件来记录这些数据库对象的创建、变更和维护,随着开发的进行需要对这些对象的脚本进行版本管理;更重要的是将这些数据库对象从开发环境移植到其它环境的时候面临着诸多的问题:
- 数据库对象本身并没有实现版本管理
- 需要安装人员执行多个数据库对象脚本
- 安装人员必须了解一定的数据库知识才能执行脚本
- 脚本的安装的方式容易出错,如果设计的脚本和目标系统有所出入,很有可能导致更新出错或带来灾难
- 需要分别为多个目标系统定制安装脚本,工作量非常大
- 脚本的格式没有统一的标准
作为开发人员很希望有一个工具来完成数据库对象在两个数据库之间的移植,而无需我们为了不同的数据库维护不同的对象脚本,避免上面所描述的问题,下面我们来看看Oracle为我们所提供的解决方案:XDF(XML Object Description File)工具。
XDF工具的原理和FNDLOAD是一样的,同样是从源系统中获取需要移植对象的元数据信息后生成数据文件(.xdf),然后在目标系统中使用数据文件根据目标系统的情况生成相应的操作来新增或者修改数据库对象。
目前版本的Xdf(EBS R12.1.1)可以完成以下数据库对象的移植:
- Table
- Index
- View
- Sequence
- Synonym
- Mview
- Mviewlog
一、ODF(Object Description File)介绍
在讲解XDF工具之前我们必须先了解一下它的前身ODF(Object Description File),ODF是在11i之前Oracle为EBS系统提供的数据库对象移植工具,它有两个组件组成:
1. ODF Generator(adodfgen):用来从源系统中生成数据库对象的描述信息文件(.odf),如生成PO_HEADERS_ALL这个表的定义信息。但是这个工具作为Oracle内部使用从来没有对外公开过,致使我们无法使用这个工具,我们所能够得到的odf数据文件都是Oracle作为补丁类型提供给我们的,因此对于我们二次开发移植来说根本无法使用ODF这个工具。
2. ODF Comparison(adodfcmp):用来在目标系统中通过对比odf数据文件和目标系统数据库中对象来生成并执行相应命令,odf文件中包括了数据库对象所有的信息,如果它发现目标系统中不存在这个对象的时候就创建它;如果目标系统中已经存在这个对象并版本低于odf文件中描述的对象就修改对象的定义。这个工具在很多补丁或者Oracle解决问题的时候会用来进行odf数据文件的对比操作。
adodfcmp可以在$AD_TOP/bin目录下找到, 由于并不是经常使用,在此就不做更多详细介绍,有兴趣的可以在命令行中输入 adodfcmp命令后回车可以看到使用的说明
使用的例子:
adodfcmp mode=sequences priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxx.odf changedb=Yes
adodfcmp mode=tables priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxxx.odf changedb=Yes
adodfcmp mode=views priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxxx.odf changedb=Yes
虽然Oracle并未公开ODF工具供我们使用,但是Oracle内部看似还在使用它,在EBS R12版中可以看到很多模块中还有odf数据文件提供,odf数据文件一般在各模块的 patch/115/odf 目录下
二、Xdf(XML Object Description File)
在Oracle EBS 11i之后,Oracle结合了Java和XML的技术推出了XDF这个数据库对象移植工具作为ODF的接班,XDF作为FND模块中的一个工具组件出现,XDF的Java实现在$JAVA_TOP/oracle/apps/fnd/odf2 目录下,它的原理和ODF以及FNDLOAD是一样的,只是XDF不像FNDLOAD那样需要控制文件而已。
但是在EBS R12之前,Oracle并未公开XDF生成工具(FndXdfGen),所以也无法用来移植客户化的数据库对象,直到R12发布的时候,FndXdfGen终于向我们开放了,至此我们终于可以在二次开发中使用Xdf这个工具。
XDF工具由2个组件构成:
- 对象描述生成工具(FndXdfGen):用来从源系统中生成数据库对象的描述信息文件(.xdf)
- 对象对比工具(FndXdfCmp):用来在目标系统中通过对比odf数据文件和目标系统数据库中对象来生成并执行相应命令,它是Xdf工具的核心
1,对象描述生成工具(FndXdfGen)
Xdf生成工具是用来从源数据库系统中将描述数据库对象的元数据信息从数据字典中取出后生成odf文件的工具,它通过Java类oracle.apps.fnd.odf2.FndXdfGen来实现
语法如下:
java oracle.apps.fnd.odf2.FndXdfGen apps_schema= apps_pwd= jdbc_protocol= jdbc_conn_string= object_name= xsl_directory= [object_type=] [owner_name=] [xdf_filename=] [deferred=<yes|no|> ] [logfile=] [dropcr=] [custom_defval=colname1=col1value;colname2=col2value] [includetriggers=][obsolete=][base_partition=][apply_dbversion=]
关键的几个参数:
- apps_schema:apps模式名称,一般为apps
- apps_pwd:apps模式的密码
- jdbc_conn_string:数据库连接信息,可以使用Net8格式的连接或者hostname:port:sid的格式
- object_name:指定要导出信息的数据库对象名称,trigger和sequence两种类型可以使用百分号(%)来一次性提取多个,其它类型需要明确指定名称,一次提取一个对象
- xsl_directory:用来做XSLT转化时所要求的xsl文件目录,通常使用$FND_TOP/patch/115/xdf/xsl 或者 $FND_TOP/admin/xdf/xsl
- jdbc_protocol:jdbc协议(thin 或 oci8)
- object_type:导出的对象类型,有table, mview, mviewlog, index, view, sequence, synonym
- owner_app_shortname:对象所属的应用简称
- xdf_filename:生成的对象描述文件名称,名称自动添加后缀”.xdf”
其它参数可以直接在命令行中输入java oracle.apps.fnd.odf2.FndXdfGen 后打印出来看
下面以移植 xhu.xhu_blog_article_2201 表为例来演示如何使用XDF工具,使用appl操作系统用户登录到EBS中间服务器,运行如下的命令:
java oracle.apps.fnd.odf2.FndXdfGen apps_schema=apps apps_pwd=apps jdbc_protocol=thin jdbc_conn_string=ebs006.hand-china.com:1522:VIS02 object_name=XHU_BLOG_ARTICLE_2201 xsl_directory=$FND_TOP/patch/115/xdf/xsl owner_app_shortname=XHU object_type=table
命令正常执行后会看到如下的日志信息输出:
Generating xdf - xhu_blog_friend_2201.xdf The xdf file contains the following objects Primary Object's Application Short Name : XHU Primary Object Schema Name : XHU Primary Object Name : XHU_BLOG_FRIEND_2201 Primary Object Type : TABLE Dependent Object Information : Indexes on XHU_BLOG_FRIEND_2201 : XHU_BLOG_FRIEND_2201_U1 None Sequence(s) on XHU_BLOG_FRIEND_2201 : XHU_BLOG_FRIEND_2201_S Policy(ies) on XHU_BLOG_FRIEND_2201 : None Created xdf successfully
从上面的日志信息中可以看到表、表上的索引、表的序列(按照<table_name>_s格式创建)和表的策略都一并导出,成功执行后会生成对象描述文件xhu_blog_article_2201.xdf,生成的对象描述文件(.xdf)是XML结构的,有兴趣的可以用记事本打开看看里面的内容。
对象描述文件记录信息的特点:
- 以XML格式描述对象信息
- 将相关联的对象一起提取出来,如表上的索引、策略和触发器等
- 不管在源系统中数据库表是否注册到EBS,生成描述信息都包含了这的信息
- 对象都具有自己的版本号,如表和表中的列都有自己的版本号
- 对象都有哈希值
系统中很多数据库对象的描述文件都保存在各模块的 patch/115/xdf 目录下
2,对象对比工具(FndXdfCmp)
FndXdfCmp是Xdf工具的核心组件,它根据对象描述文件(.xdf)中对象的信息,并根据目标数据库中对应对象的存在情况来生成对应的DDL语句,例如表对象,如果在目标系统中不存在,那就生成CREATE TABLE语句,否则就生成ALTER TABLE语句。
FndXdfCmp根据对象描述文件的内容、目标系统的对象存在情况以及对象类型来生成相应的DDL语句,整个XDF工具的魅力也就在此,不管存在多少个目标系统,我们移植时只需要一个对象的描述文件(.xdf),剩下的事情全部交给XDF对比工具(FndXdfCmp)去为我们完成。
FndXdfCmp使用语法:
java oracle.apps.fnd.odf2.FndOdfCmp < schema_name> < schema_Pwd> < apps_schema> < apps_pwd><jdbc_protocol> <jdbc_conn_string> <object_type> <xdf_filename> <xsl_directory> [CLONE_UN=<apps_clone_schema_id> CLONE_PW=<apps_clone_schema_password> SPEC_UN=<table_specs_schema_id> SPEC_PW=<table_specs_schema_password>] <xsl file Dir>[deferred=<list>] [dropCr=<list>] [logfile=<filename>] [changedb=<y/n>] [data_sec_vpd=<y/n>] [parallel_index_threshold=<block count>] [index_category=<small/large/both>]
关键的几个参数:
- schema_name:对象所属模式的名称
- schema_pwd:对象所属模式的密码
- jdbc_protocol:jdbc协议(thin 或 oci8)
- jdbc_conn_string:数据库连接信息,可以使用Net8格式的连接或者hostname:port:sid的格式
- object_type:对比的对象类型,有table, mview, mviewlog, index, view, sequence, synonym
- xdf_filename:对象描述文件的名称
- xsl_directory:用来做XSLT转化时所要求的xsl文件目录,通常使用$FND_TOP/patch/115/xdf/xsl 或者 $FND_TOP/admin/xdf/xsl
其它参数可以直接在命令行中输入java oracle.apps.fnd.odf2.FndXdfCmp后打印出来看
将xhu.xhu_blog_article_2201表的数据文件传到目标系统下,使用appl操作系统用户登录到EBS中间服务器,运行如下的命令来将xhu.xhu_blog_article_2201表移植到新的环境中:
java oracle.apps.fnd.odf2.FndXdfCmp XHU XHU APPS APPS thin ebs12.hand-china.com:1522:VIS04 table xhu_blog_article_2201.xdf $FND_TOP/patch/115/xdf/xsl
使用Xdf移植的数据库表会自动注册到EBS里面,即注册到FND_TABLES表中,成功执行后可以登录数据库查看数据库对象的情况,
SELECT * FROM dba_objects WHERE object_name = upper(‘xhu_blog_article_2201′);
SELECT * FROM fnd_tables WHERE table_name = upper(‘xhu_blog_article_2201′);
3,Xdf使用步骤
一般二次开发过程中都需要从开发环境将数据库对象移植到其它环境,或者标准化开发完成的程序安装到客户环境中,使用Xdf工具的步骤:
- 在开发环境中设计好数据库对象
- 使用描述对象生成工具FndXdfGen生成数据库对象的描述文件(.xdf)
- 将对象描述文件传到目标环境下或者打包发给相关人员
- 运行对象对比工具FndXdfCmp来在目标数据库中生成对象或修改对象
这样一来移植工作就完成了,通过Xdf工具来进行数据库对象的移植,整个移植的核心纽带则转移到了对象描述文件(.xdf)上面,而这个文件只是以XML的方式记录了对象的信息,和目标系统没有任何关系,这样使数据库对象的移植变得灵活简单并高效。