Идентификация таблиц Sybase, полей, ключей, ограничений

Я пытаюсь настроить запрос Sybase, который даст мне следующий результат:

Table     KeyType      KeyNumber      Column
table1    PK           1              table1_id
table1    FK           2              table2_id    
table1    FK           3              table3_id
table1    FK           4              table4_id
table1    Unique       5              table1_abc
table1    Unique       5              table1_def

Другими словами, мне нужен PK для каждой таблицы и каждого внешнего ключа, а также каждого уникального ключа (не там, где ключ имеет более одного элемента, например уникальный ключ выше, это идентифицируется наличием одного и того же номер ключа).

Я предполагаю, что мне нужно использовать sysobject, syscolumns, syskeys и sysconstraints, но я не могу понять, как они взаимосвязаны.

Спасибо
Карл


person Karl    schedule 09.02.2011    source источник


Ответы (1)


Это начало:

SELECT 
    t.name, 
    CASE k.type 
        WHEN 1 THEN 'PK' 
        WHEN 2 THEN 'FK'
        WHEN 3 THEN 'Common'
    END,
    c.name
FROM 
    sysobjects t INNER JOIN 
    syscolumns c ON c.id = t.id INNER JOIN
    syskeys k ON k.id = t.id AND c.colid IN (k.key1, k.key2, k.key3, k.key4, k.key5, k.key6, k.key7, k.key8)
WHERE 
    t.type = 'U' AND k.type in (1,2)

Он не включает идентификатор ключа, для этого, я думаю, вы могли бы каким-то образом хешировать ненулевой идентификатор таблицы и столбцы keyN, чтобы создать уникальный идентификатор для ключа.

Он также не включает уникальные индексы. Для этого вам нужно UNION что-то вроде:

SELECT 
    t.name, 
    'Unique',
    c.name
FROM 
    sysobjects t INNER JOIN 
    syscolumns c ON c.id = t.id INNER JOIN
    sysindexes i ON i.id = t.id
WHERE t.type = 'U'

Ознакомьтесь с Справочная страница Sybase для sysindexes о том, как ее фильтровать.

person SimonC    schedule 18.02.2011