При кастомизации и глубоком администрировании Siemens Teamcenter стандартных средств трассировки связей в RAC или через SOA не всегда достаточно. Когда нужно мгновенно проанализировать дерево отношений объекта или найти скрытые зависимости в базе данных Oracle, на помощь приходит прямой SQL.
В этой заметке я поделюсь двумя проверенными запросами, которые регулярно использую для диагностики данных и отладки плагинов.
Анализ отношений бизнес-объектов (ImanRelation)
Этот запрос позволяет вытащить полную информацию обо всех отношениях (ImanRelation), в которых участвует целевой объект. Он полезен, когда нужно понять, как связаны вторичные и первичные объекты, а также увидеть имена классов из PPOM_CLASS.
/* Информация об отношениях объекта */
SELECT
t001.puid, t001.rprimary_objectu, t001.rprimary_objectc, t001.rprimary_pname,
t001.rsecondary_objectu, t001.rsecondary_objectc, t001.rsecondary_pname,
t001.rrelation_typeu, t001.rrelation_typec, t002.ptype_name
FROM (
SELECT
T03.*, T04.PNAME AS RSECONDARY_PNAME
FROM (
SELECT
T01.*, T02.PNAME AS RPRIMARY_PNAME
FROM
INFODBA.PIMANRELATION T01
LEFT OUTER JOIN (
SELECT
PNAME, PCPID
FROM INFODBA.PPOM_CLASS) T02
ON
T01.RPRIMARY_OBJECTC=T02.PCPID
WHERE
T01.RPRIMARY_OBJECTU=:param1
OR T01.RSECONDARY_OBJECTU=:param1) T03
LEFT OUTER JOIN (
SELECT
PNAME, PCPID
FROM
INFODBA.PPOM_CLASS) T04
ON
T03.RSECONDARY_OBJECTC=T04.PCPID
WHERE (T03.RPRIMARY_OBJECTU=:param1
OR T03.RSECONDARY_OBJECTU=:param1)) t001
LEFT OUTER JOIN
INFODBA.PIMANTYPE t002
ON
t001.rrelation_typeu = t002.puid; Примечание: в качестве :param1 подставляйте PUID интересующего вас объекта. DBeaver вывод диалог для запроса значения параметра
Поиск обратных связей через POM_BACKPOINTER
Иногда связь не прописана в PIMANRELATION, но объект ссылается на другой через атрибуты. В таких случаях мы используем таблицу обратных указателей POM_BACKPOINTER. Этот запрос незаменим при поиске ответа на вопрос «Кто ссылается на этот объект?», когда встроенный «Where Used» работает слишком медленно.
SELECT
T03.*, T04.PNAME AS FROM_CLASS_PNAME
FROM (
SELECT
T01.*, T02.PNAME AS TO_CLASS_PNAME
FROM
INFODBA.POM_BACKPOINTER T01
LEFT OUTER JOIN (
SELECT
PNAME, PCPID FROM INFODBA.PPOM_CLASS) T02
ON
T01.TO_CLASS=T02.PCPID
WHERE
T01.TO_UID=:param1
OR T01.FROM_UID=:param1) T03
LEFT OUTER JOIN (
SELECT
PNAME, PCPID FROM INFODBA.PPOM_CLASS) T04
ON
T03.FROM_CLASS=T04.PCPID
WHERE
T03.TO_UID=:param1
OR T03.FROM_UID=:param1;Почему это важно?
Использование прямого доступа к схеме INFODBA позволяет:
- Ускорить генерацию отчетов в десятки раз по сравнению с классическими ITK/SOA методами.
- Находить битые связи, которые не отображаются в интерфейсе Teamcenter из-за ошибок в метаданных.
- Видеть «изнанку» системы, понимая, как именно распределены классы и типы объектов в базе данных Oracle.