为什么pg数据库9.2版本逆向解析时索引出错?

Viewed 29

由于系统自带的元数据查询模板适配的pg的版本较高,而相同数据库不同的版本之前元数据的存储已经查询语法有差异,导致在低版本的可能无法正确的执行查询,如下图:

image.png

可尝试采用下方兼容查询模板(复制下方的的模板替换原有的数据库模板):

08dc8172-ff06-4f4f-92ef-1dfd045f22f1.png

兼容模板:

SELECT
  ns.nspname AS schema_name,
  T.relname AS tbl_def_key,
  COALESCE(A.attname, (pg_get_indexdef(ix.indexrelid, ord, TRUE))::TEXT) AS col_def_key,
  d.description AS def_name,
  CASE
    WHEN ix.indisunique THEN 'UNIQUE'
    ELSE 'NORMAL'
  END AS type,
  CASE
    WHEN (ix.indoption[ord - 1] & 1) = 0 THEN 'ASC'
    ELSE 'DESC'
  END AS sort_type,
  ord AS order_value,
  idx.relname AS def_key
FROM
  pg_class T
  JOIN pg_namespace ns ON ns.oid = T.relnamespace
  JOIN pg_index ix ON T.oid = ix.indrelid
  JOIN pg_class idx ON ix.indexrelid = idx.oid
  JOIN pg_am am ON idx.relam = am.oid
  JOIN (
    SELECT
      i.indexrelid,
      generate_series(1, i.indnatts) AS ord
    FROM
      pg_index i
  ) AS key_cols ON key_cols.indexrelid = ix.indexrelid
  LEFT JOIN pg_attribute A 
    ON A.attrelid = T.oid 
   AND A.attnum = ix.indkey[key_cols.ord - 1]
   AND A.attnum > 0 
   AND NOT A.attisdropped
  LEFT JOIN pg_description d ON d.objoid = idx.oid AND d.objsubid = 0
WHERE
  ns.nspname IN (:schemaName) 
  AND CONCAT (ns.nspname, '.', T.relname) IN (:sysTableNames) 
  AND indisprimary = FALSE 
ORDER BY
  ns.nspname,
  tbl_def_key,
  def_key,
  order_value;
0 Answers