有没有办法在 ODI 元数据数据库的某处找到数据存储对象的强制执行上下文?

Is thera a way to find forced execution context on datastore objects, somewhere in ODI metadata database?

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

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

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

下面列出了一些可能包含您要查找的值的表和列。

这些表和列来自 ODI 12.1.2,根据您使用的具体 ODI 版本,结构可能略有不同。

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

乱摆桌子是禁忌。 API 更好。特别是如果你要修改任何东西。 https://docs.oracle.com/en/middleware/data-integrator/12.2.1.3/odija/index.html

运行 ODI 中的以下 groovy 脚本(Tools/Groovy/New 脚本)。修改起来应该很简单。如果您设法在 IntelliJ 或其他 Java IDE 中设置完整的开发环境,使用 SDK 会变得容易得多。 Groovy在ODI开辟了一个全新的世界。

//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()}"
        }
    }
}

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

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

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%