Как указал Джонатан: не существует прямого способа связать оба объекта. Однако, если вы «соблюдаете стандарт» для первичных ключей и последовательностей / триггеров, вы можете узнать об этом, найдя первичный ключ, а затем связать ограничение с последовательностью таблиц.
Мне нужно что-то подобное, так как мы создаем продукт с несколькими базами данных, и я попытался воспроизвести некоторые классы со свойствами, найденными в объекте DataTable из .Net, который имеет AutoIncrement, IncrementSeed и IncrementStep, который можно найти только последовательности.
Итак, как я уже сказал, если вы используете для своих таблиц PK и у вас всегда есть последовательность, связанная с триггером для вставок в таблицу, это может пригодиться:
select tc.table_name,
case tc.nullable
when 'Y' then 1
else 0
end as is_nullable,
case ac.constraint_type
when 'P' then 1
else 0
end as is_identity,
ac.constraint_type,
seq.increment_by as auto_increment_seed,
seq.min_value as auto_increment_step,
com.comments as caption,
tc.column_name,
tc.data_type,
tc.data_default as default_value,
tc.data_length as max_length,
tc.column_id,
tc.data_precision as precision,
tc.data_scale as scale
from SYS.all_tab_columns tc
left outer join SYS.all_col_comments com
on (tc.column_name = com.column_name and tc.table_name = com.table_name)
LEFT OUTER JOIN SYS.ALL_CONS_COLUMNS CC
on (tc.table_name = cc.table_name and tc.column_name = cc.column_name and tc.owner = cc.owner)
LEFT OUTER JOIN SYS.ALL_CONSTRAINTS AC
ON (ac.constraint_name = cc.constraint_name and ac.owner = cc.owner)
LEFT outer join user_triggers trg
on (ac.table_name = trg.table_name and ac.owner = trg.table_owner)
LEFT outer join user_dependencies dep
on (trg.trigger_name = dep.name and dep.referenced_type='SEQUENCE' and dep.type='TRIGGER')
LEFT outer join user_sequences seq
on (seq.sequence_name = dep.referenced_name)
where tc.table_name = 'TABLE_NAME'
and tc.owner = 'SCHEMA_NAME'
AND AC.CONSTRAINT_TYPE = 'P'
union all
select tc.table_name,
case tc.nullable
when 'Y' then 1
else 0
end as is_nullable,
case ac.constraint_type
when 'P' then 1
else 0
end as is_identity,
ac.constraint_type,
seq.increment_by as auto_increment_seed,
seq.min_value as auto_increment_step,
com.comments as caption,
tc.column_name,
tc.data_type,
tc.data_default as default_value,
tc.data_length as max_length,
tc.column_id,
tc.data_precision as precision,
tc.data_scale as scale
from SYS.all_tab_columns tc
left outer join SYS.all_col_comments com
on (tc.column_name = com.column_name and tc.table_name = com.table_name)
LEFT OUTER JOIN SYS.ALL_CONS_COLUMNS CC
on (tc.table_name = cc.table_name and tc.column_name = cc.column_name and tc.owner = cc.owner)
LEFT OUTER JOIN SYS.ALL_CONSTRAINTS AC
ON (ac.constraint_name = cc.constraint_name and ac.owner = cc.owner)
LEFT outer join user_triggers trg
on (ac.table_name = trg.table_name and ac.owner = trg.table_owner)
LEFT outer join user_dependencies dep
on (trg.trigger_name = dep.name and dep.referenced_type='SEQUENCE' and dep.type='TRIGGER')
LEFT outer join user_sequences seq
on (seq.sequence_name = dep.referenced_name)
where tc.table_name = 'TABLE_NAME'
and tc.owner = 'SCHEMA_NAME'
AND AC.CONSTRAINT_TYPE is null;
Это даст вам список столбцов для схемы / таблицы с:
- Название таблицы
- Если столбец обнуляемый
- Тип ограничения (только для ПК)
- Прирост семян (из последовательности)
- Шаг приращения (из последовательности)
- Комментарии к колонке
- Название столбца, конечно:)
- Тип данных
- Значение по умолчанию, если есть
- Длина столбца
- Индекс (идентификатор столбца)
- Точность (для чисел)
- Шкала (для чисел)
Я почти уверен, что код можно оптимизировать, но он работает для меня, я использую его для «загрузки метаданных» для таблиц, а затем представляю эти метаданные в виде сущностей на моем интерфейсе.
Обратите внимание, что я фильтрую только первичные ключи и не получаю ограничения составного ключа, так как меня это не волнует. Если вы это сделаете, вам придется изменить код, чтобы сделать это, и убедиться, что вы фильтруете дубликаты, поскольку вы можете получить один столбец дважды (один для ограничения PK, другой для составного ключа).