oracle-data-integrator - 有没有一种方法可以在 ODI 元数据数据库中的某处找到数据存储对象上的强制执行上下文?
问题描述
我有一个带有 30 个映射的 ODI 12c 项目。我需要检查每个数据存储对象(源或目标)上的每个“组件上下文”是否设置为“执行上下文”(非强制)。有没有办法通过查询 ODI 底层数据库来实现这一点,这样我就不必手动执行此操作并避免可能的错误?
我有一个从 Oracle 支持网站获得的 ODI 12c 存储库表和表列的注释列表,经过数小时的数据库挖掘后,我仍然看不到存储在任何表中的这些信息。
我的包位于 SNP_PACKAGE 中,SNP_MAPPING 有关于映射的信息,SNP_MAP_COMP 描述映射中的对象。我也搜索了许多不同的表格。
解决方案
有点晚了,但对于其他人来说
把桌子弄乱是不行的。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()}"
}
}
}
推荐阅读
- unit-testing - AppSelfHostBase 无法解析
- c - C - 将半字节从一个字节复制到另一个字节以产生位移 4
- laravel - 尝试获取包含您关注的人的所有文件的记录集
- python - 复杂的正则表达式比预期的要少
- python - 使用大型数据集匹配同一列中的字符串?
- joomla - Joomla 编辑超级用户 500 内部服务器错误
- python - 通过从头开始解析给定的单词集合来定义预定义大小的新单词集合
- angular - 在角度的DOM查询列表中嵌套遍历
- symfony - 如何映射到从实体中的内存提供的用户
- java - Java - 当我们创建数组时,这些表达式会做什么?