首页 > 解决方案 > 有没有一种方法可以在 ODI 元数据数据库中的某处找到数据存储对象上的强制执行上下文?

问题描述

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

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

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

标签: oracle-data-integrator

解决方案


有点晚了,但对于其他人来说

把桌子弄乱是不行的。API 更好。特别是如果您要修改任何内容。 https://docs.oracle.com/en/middleware/data-integrator/12.2.1.3/odija/index.html

在 ODI (Tools/Groovy/New Script) 中运行以下 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()}"
        }
    }
}

推荐阅读