Как я могу получить подробности ограничения по имени в Informix? - PullRequest
4 голосов
/ 26 ноября 2008

При программировании большой транзакции (много вставок, удалений, обновлений) и, таким образом, нарушении ограничения в Informix (v10, но должно применяться и к другим версиям), я получаю не очень полезное сообщение о том, что, например, я нарушил ограничение r190_710. Как я могу узнать, какие таблицы и ключ (ы) покрыты определенным ограничением, которое я знаю только по имени?

Ответы [ 7 ]

6 голосов
/ 29 ноября 2008

Тони Эндрюс предложил (указывая на другую конечную точку для URL):

Из Руководство Informix по SQL: Справочник Похоже, вам следует взглянуть на таблицы системного каталога SYSCONSTRAINTS и SYSINDICES.

В этом руководстве описан системный каталог Informix.

Таблица SysConstraints является отправной точкой для анализа ограничения, скорее всего; вы найдете имя ограничения в этой таблице, а оттуда вы можете узнать другие детали.

Однако вы также должны просматривать другие таблицы, а не только (или даже напрямую) SysIndices.

Например, у меня есть много ограничений NOT NULL для таблиц в моей базе данных. Для них тип ограничения - «N», и больше нет необходимости искать дополнительную информацию.

Тип ограничения «P» указывает первичный ключ; это потребовало бы большего анализа через представление SysIndexes или таблицу SysIndices. Аналогично, тип ограничения «U» указывает на уникальное ограничение и нуждается в дополнительной информации из представления SysIndexes или таблицы SysIndices.

Тип ограничения 'C' указывает проверочное ограничение; текст (и двоичная скомпилированная форма) ограничения находится в таблице SysChecks (с типами 'T' и 'B' для данных; данные более или менее закодированы с помощью Base-64, но без заполнения '=' в конце и используя разные символы для 62 и 63).

Наконец, тип ограничения 'R' указывает ограничение ссылочной целостности. Вы используете таблицу SysReferences, чтобы узнать, на какую таблицу ссылаются, и вы используете SysIndexes или SysIndices, чтобы определить, какие индексы в ссылочных и ссылочных таблицах используются, и из этого вы можете обнаружить соответствующие столбцы. Это может стать довольно волосатым!

3 голосов
/ 08 июня 2012

Столбцы в таблице с ограничением на них

SELECT
    a.tabname, b.constrname, d.colname
FROM
    systables a, sysconstraints b, sysindexes c, syscolumns d
WHERE
    a.tabname = 'your_table_name_here'
AND
    b.tabid = a.tabid
AND
    c.idxname = b.idxname
AND
    d.tabid = a.tabid
AND
(
    d.colno = c.part1 or 
    d.colno = c.part2 or 
    d.colno = c.part3 or 
    d.colno = c.part4 or 
    d.colno = c.part5 or 
    d.colno = c.part6 or 
    d.colno = c.part7 or 
    d.colno = c.part8 or 
    d.colno = c.part9 or 
    d.colno = c.part10 or 
    d.colno = c.part11 or 
    d.colno = c.part12 or
    d.colno = c.part13 or 
    d.colno = c.part14 or 
    d.colno = c.part15 or 
    d.colno = c.part16
)
ORDER BY
    a.tabname, 
    b.constrname,
    d.colname
1 голос
/ 27 октября 2016

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

sysconstraints.constrtype указывает тип ограничения:

  • P = Первичный ключ
  • U = Уникальный ключ / Альтернативный ключ
  • N = Не ноль
  • C = Проверить
  • R = Ссылка / Внешний ключ
select
  tab.tabname,
  constr.*, 
  chk.*,
  c1.colname col1,
  c2.colname col2,
  c3.colname col3,
  c4.colname col4,
  c5.colname col5
from sysconstraints constr
  join systables tab on tab.tabid = constr.tabid
  left outer join syschecks chk on chk.constrid = constr.constrid and chk.type = 'T'
  left outer join sysindexes i on i.idxname = constr.idxname
  left outer join syscolumns c1 on c1.tabid = tab.tabid and c1.colno = abs(i.part1)
  left outer join syscolumns c2 on c2.tabid = tab.tabid and c2.colno = abs(i.part2)
  left outer join syscolumns c3 on c3.tabid = tab.tabid and c3.colno = abs(i.part3)
  left outer join syscolumns c4 on c4.tabid = tab.tabid and c4.colno = abs(i.part4)
  left outer join syscolumns c5 on c5.tabid = tab.tabid and c5.colno = abs(i.part5)
where constr.constrname = 'your constraint name'
0 голосов
/ 09 декабря 2015

Если ваше ограничение называется constraint_c6, вот как вывести его определение (ну, вам все равно нужно объединить строки, так как они будут разделены пробелами):

OUTPUT TO '/tmp/constraint_c6.sql' WITHOUT HEADINGS
SELECT ch.checktext
FROM  syschecks ch, sysconstraints co
WHERE ch.constrid = co.constrid
  AND ch.type = 'T' -- text lines only
  AND co.constrname = 'constraint_c6' 
ORDER BY ch.seqno;
0 голосов
/ 01 октября 2015

, чтобы получить таблицу, на которую влияет ограничение "r190_710":

select TABNAME from SYSTABLES where TABID IN
(select TABID from sysconstraints where CONSTRID IN
(select CONSTRID from sysreferences where PTABID IN 
(select TABID from sysconstraints where CONSTRNAME= "r190_710" )
)
);
0 голосов
/ 03 декабря 2008

Из серфинга на www.iiug.org (Международная группа пользователей Informix) я нашел не очень простое решение.

(1) Получить ссылочные данные ограничения из имени ограничения (вы можете получить все ограничения для таблицы, заменив «AND sc.constrname =?» На «AND st.tabname MATCHES?»). Этот оператор выбирает здесь больше полей, чем необходимо, потому что они могут быть интересны в других ситуациях.

SELECT si.part1, si.part2, si.part3, si.part4, si.part5, 
    si.part6, si.part7, si.part8, si.part9, si.part10, 
    si.part11, si.part12, si.part13, si.part14, si.part15, si.part16, 
    st.tabname, rt.tabname as reftable, sr.primary as primconstr, 
    sr.delrule, sc.constrid, sc.constrname, sc.constrtype, 
    si.idxname, si.tabid as tabid, rc.tabid as rtabid 
FROM 'informix'.systables st, 'informix'.sysconstraints sc, 
     'informix'.sysindexes si, 'informix'.sysreferences sr, 
     'informix'.systables rt, 'informix'.sysconstraints rc 
WHERE st.tabid = sc.tabid 
  AND st.tabtype != 'Q' 
  AND st.tabname NOT MATCHES 'cdr_deltab_[0-9][0-9][0-9][0-9][0-9][0-9]*' 
  AND rt.tabid = sr.ptabid 
  AND rc.tabid = sr.ptabid
  AND sc.constrid = sr.constrid 
  AND sc.tabid = si.tabid 
  AND sc.idxname = si.idxname 
  AND sc.constrtype = 'R' 
  AND sc.constrname = ?
  AND sr.primary = rc.constrid 
ORDER BY si.tabid, sc.constrname

(2) Используйте part1-part16, чтобы определить, на какой столбец влияет ограничение: часть [n], содержащая значение, отличное от 0, содержит номер столбца используемого столбца. Используйте (3), чтобы найти имя столбца.

Если constrtype равен 'R' (ссылка), используйте следующую инструкцию, чтобы найти части таблицы ссылки:

SELECT part1, part2, part3, part4, part5, part6, part7, part8, 
    part9, part10, part11, part12, part13, part14, part15, part16 
FROM 'informix'.sysindexes si, 'informix'.sysconstraints sc 
WHERE si.tabid = sc.tabid 
AND si.idxname = sc.idxname 
AND sc.constrid = ? -- primconstr from (1)

(3) tabid и rtabid (для ссылки на ограничения) из (1) теперь могут использоваться для получения столбцов таблиц следующим образом:

SELECT colno, colname 
FROM 'informix'.syscolumns 
WHERE tabid = ? -- tabid(for referenced) or rtabid(for referencing) from (1)
  AND colno = ? -- via parts from (1) and (2)
ORDER BY colno

(4) Если constrtype равен 'C', тогда получите информацию о проверке, например:

SELECT type, seqno, checktext
FROM 'informix'.syschecks
WHERE constrid = ? -- constrid from (1)

Довольно волосатый, действительно

0 голосов
/ 26 ноября 2008

Из Руководство Informix по SQL: Справочник Похоже, вам следует взглянуть на таблицы системного каталога SYSCONSTRAINTS и SYSINDICES.

...