Thera是一种在ODI元数据数据库中某处的数据存储对象上找到强制执行上下文的方法吗?

时间:2019-04-16 07:27:25

标签: oracle-data-integrator

我有一个包含30个映射的ODI 12c项目。我需要检查每个数据存储对象(源或目标)上的每个“组件上下文”是否都设置为“执行上下文”(不是强制)。 有没有一种方法可以通过查询ODI底层数据库来实现,所以我不必手动进行操作并避免可能的错误?

我有一个ODI 12c存储库表的列表和从Oracle支持网站获得的表列注释,经过数小时的数据库挖掘,我仍然看不到任何表中存储的信息。

我的程序包位于SNP_PACKAGE中,SNP_MAPPING具有有关映射的信息,而SNP_MAP_COMP描述了映射中的对象。 我也搜索了许多不同的表格。

3 个答案:

答案 0 :(得分:1)

有点晚了,但对于其他寻找的人

对表的访问是不行的。 API更好。特别是如果您要修改任何东西。 https://docs.oracle.com/en/middleware/data-integrator/12.2.1.3/odija/index.html

在ODI中运行以下groovy脚本(工具/ Groovy /新脚本)。应该足够简单地进行修改。如果您设法在IntelliJ或其他Java IDE中设置完整的开发环境,则使用SDK会容易得多。 ODI中的Groovy开拓了一个全新的世界。

//Created by DI Studio
import oracle.odi.domain.mapping.Mapping
import oracle.odi.domain.mapping.finder.IMappingFinder

tme = odiInstance.getTransactionalEntityManager()

IMappingFinder mapf = (IMappingFinder) tme.getFinder(Mapping.class)
Collection<Mapping> mappings = mapf.findByProject("PROJECT","FOLDER")
println("Found ${mappings.size()} mappings")

mappings.each { map ->
    map.physicalDesigns.each{ phys ->
        phys.physicalNodes.each{ node ->
            println("${map.project.name}...${map.parentFolder.parentFolder?.name}.${map.parentFolder.name}.${map.name}.${phys.name}.${node.name}.defaultContext=${(node.context.defaultContext) ? "default" : node.context.name}")
        }
    }
}

它打印默认或设置(强制)上下文。似乎强制上下文已在12c中弃用。 Physical.node.context.defaultContext似乎反映了ODI Studio 12.2.1.3中的组件上下文(强制)。 https://docs.oracle.com/en/middleware/data-integrator/12.2.1.3/odija/index.html

更新2019-12-20-包括getExecutionContextName 以下脚本以分层的方式列出,可能更易于阅读代码。不知道您是否能获得原先的状态,而不必进行精确的设置映射。

//Created by DI Studio
import oracle.odi.domain.mapping.Mapping
import oracle.odi.domain.mapping.finder.IMappingFinder
import oracle.odi.domain.mapping.component.DatastoreComponent

tme = odiInstance.getTransactionalEntityManager()

String project = "PROJECT"
String parentFolder = "PARENT_FOLDER"

IMappingFinder mapf = (IMappingFinder) tme.getFinder(Mapping.class)
Collection<Mapping> mappings = mapf.findByProject(project, parentFolder)
println("Found ${mappings.size()} mappings")

println "Project: ${project}"
mappings.each { map ->
    println "\tMapping: ..${map.parentFolder.parentFolder?.name}/${map.parentFolder.name}/${map.name}"
    map.physicalDesigns.each{ phys ->
        println "\t\tPhysical: ${phys.name}"
        phys.physicalNodes.each{ node ->
            println "\t\t\tNode: ${node.name}"
            println "\t\t\t\tdefaultContext: ${(node.context.defaultContext)}" 
            println "\t\t\t\tNode context name: ${node.context.name}"
            println "\t\t\t\tDatastoreComponent ExecutionContextName: ${DatastoreComponent.getDatastoreComponent(node)?.getExecutionContextName(node).toString()}"
        }
    }
}

答案 1 :(得分:0)

下面是一些表和列的列表,其中可能包含您要查找的值。

Table+Column list for finding execution context

这些表和列来自ODI 12.1.2,具体取决于所使用的ODI版本,结构可能有所不同。

答案 2 :(得分:0)

这里也是直接从数据库检索此信息的查询。

-映射中数据存储上的强制上下文

SELECT MAPP.NAME MAP_NAME, MAPP_COMP.NAME DATASTORE_NAME, 
MAPP_REF.QUALIFIED_NAME FORCE_CONTEXT
FROM SNP_MAPPING MAPP
   INNER JOIN SNP_MAP_REF MAPP_REF 
       ON MAPP_REF.I_OWNER_MAPPING = MAPP.I_MAPPING
    INNER JOIN SNP_MAP_PROP MAPP_PROP  
       ON MAPP_REF.I_MAP_REF = MAPP_PROP.I_PROP_XREF_VALUE
   INNER JOIN ODIW12.SNP_MAP_COMP MAPP_COMP 
       ON MAPP_COMP.I_MAP_COMP = MAPP_PROP.I_MAP_COMP
WHERE
   MAPP_REF.ADAPTER_INTF_TYPE = 'IContext' 
   and MAPP.NAME like %yourMapping%