запрос базы данных otrs

У меня проблема с созданием запроса к базе данных postgresql из OTRS. Мне нужно получить список активов с некоторыми данными, которые хранятся в CMDB, но у меня возникли проблемы со способом хранения данных.

Этот запрос работает нормально, но как только я добавляю еще одно левое соединение, чтобы получить больше данных, он просто работает вечно, не возвращая никаких результатов.

Насколько я вижу, проблема в том, что вся информация содержится в таблице xml_storage без каких-либо отношений, поэтому мне нужно повторно запрашивать эту таблицу, чтобы получить данные. Существует также сочетание типов данных, в которых целое число в некоторых случаях хранится как переменный символ, и это не позволяет мне использовать это значение для получения дополнительной информации из общего каталога.

Я несколько дней бился головой о кирпичную стену, поэтому буду очень признателен за любую помощь.

SELECT 
      asset_value,
      manufacturer_value,
      model_value,
      serial_value,
      fqdn_value,
      array_agg(service),
      purchasedate_value,
      status_value,
      configitem.configitem_number,
      configitem_version.name,
      general_catalog.name

    FROM 
      public.configitem_version,
      public.general_catalog,
      public.configitem 

    left join
      (SELECT
      xml_storage.xml_content_value AS asset_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''Asset Number''}[1]{''Content''}')   as select_asset on last_version_id::int = select_asset.xml_key::int

    left join
      (SELECT
      xml_storage.xml_content_value AS manufacturer_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''Manufacturer''}[1]{''Content''}' ) as select_manufacturer on last_version_id::int = select_manufacturer.xml_key::int

    left join
      (SELECT
      xml_storage.xml_content_value AS model_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''Model''}[1]{''Content''}' ) as select_model on last_version_id::int = select_model.xml_key::int

    left join
      (SELECT
      xml_storage.xml_content_value AS serial_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''SerialNumber''}[1]{''Content''}' ) as select_serial on last_version_id::int = select_serial.xml_key::int

    left join
      (SELECT
      xml_storage.xml_content_value AS fqdn_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''FQDN''}[1]{''Content''}' ) as select_fqdn on last_version_id::int = select_fqdn.xml_key::int

    left join
      (SELECT 
      link_relation.source_key AS "configitem_id", 
      service.name AS "service"
      FROM 
      public.link_relation, 
      public.service
      WHERE 
      link_relation.target_key::int = service.id AND
      link_relation.target_object_id::int = 2 AND link_relation.source_object_id::int = 3
      UNION
      SELECT 
      link_relation.target_key AS "configitem_id", 
      service.name AS "service"
      FROM 
      public.link_relation, 
      public.service
      WHERE 
      link_relation.source_key::int = service.id AND
      link_relation.target_object_id::int = 3 AND link_relation.source_object_id::int = 2) as select_service on configitem.id = configitem_id::int

    left join
      (SELECT
      xml_storage.xml_content_value AS purchasedate_value,
      xml_storage.xml_key
      FROM
      public.xml_storage 
      WHERE
      xml_content_key = '[1]{''Version''}[1]{''PurchaseDate''}[1]{''Content''}' ) as select_purchasedate on last_version_id::int = select_purchasedate.xml_key::int

    left join
      (SELECT
      general_catalog.name AS status_value,
      general_catalog.id
      FROM
      public.general_catalog) as select_status on configitem.cur_depl_state_id::int = select_status.id::int

    WHERE
      configitem.last_version_id = configitem_version.id AND
      configitem.class_id = general_catalog.id AND
      (configitem.class_id = 32 OR configitem.class_id = 33)


    GROUP BY
      asset_value,
      manufacturer_value,
      model_value,
      serial_value,
      fqdn_value,
      purchasedate_value,
      status_value,
      configitem.configitem_number,
      configitem_version.name,
      general_catalog.name

    ;

person karl    schedule 05.11.2012    source источник
comment
Выглядит совершенно ужасной схемой. Для запроса, который выполняется вечно, что об этом сообщает explain? explain select ...   -  person Craig Ringer    schedule 06.11.2012


Ответы (2)


Можно ли использовать OTRS API вместо запроса? Так будет немного легче получить ваши данные. Также модуль ImportExport позволяет экспортировать данные в файлы .csv; в зависимости от ваших потребностей это может быть вариантом.

person MichielB    schedule 06.11.2012

В итоге я создал быстрый и грязный скрипт веб-скрейпинга, чтобы получить нужные мне данные. Лучшим способом, как упоминалось ранее, было бы установить функции библиотеки импорта/экспорта, но человек с необходимыми навыками и разрешениями для добавления расширения был связан. https://github.com/OTRS/ImportExport

https://github.com/colif/Python_Utils/blob/master/OTRS-Web-Scraper-Clean.py

person Colin Fraser    schedule 15.04.2019