SELECT *
FROM sys.foreign_keys fk
WHERE EXISTS
(
SELECT *
FROM sys.foreign_key_columns fkc
WHERE fkc.constraint_object_id = fk.object_id
AND NOT EXISTS
(
SELECT *
FROM sys.index_columns ic
WHERE ic.object_id = fkc.parent_object_id
AND ic.column_id = fkc.parent_column_id
AND ic.index_column_id = fkc.constraint_column_id
)
)
У меня нет под рукой копии SQL Server 2000
, но вам может потребоваться изменить sys.foreign_key
на sysforeignkeys
и т. Д., Как описано here
.
Этот запрос выбирает все внешние ключи, которые не имеют индекса, охватывающего все столбцы, составляющие ключ.
Это также поддерживает внешние столбцы с несколькими столбцами.
Это, однако, вернет ложное срабатывание, если есть составной индекс, который охватывает все столбцы, но они не являются крайними левыми столбцами в этом индексе.
Например, если есть FOREIGN KEY (col2, col3)
и индекс для (col1, col2, col3)
, это вернет, что есть индекс, несмотря на тот факт, что этот индекс непригоден для этого внешнего ключа.