SQL Server: список внешних ключей на определенную таблицу

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы получить список всех внешних ключей, которые ссылки содержат ссылку на конкретную таблицу, можно применить следующий SQL-запрос:

SQL
Скопировать код
SELECT 
    fk.name AS ForeignKey,
    tp.name AS TableWithFK
FROM 
    sys.foreign_keys fk
JOIN 
    sys.tables tp ON fk.parent_object_id = tp.object_id
JOIN 
    sys.tables ref ON fk.referenced_object_id = ref.object_id
WHERE 
    ref.name = 'YourTable' -- замените на имя вашей таблицы
ORDER BY 
    TableWithFK, ForeignKey;

Этот запрос выведет имена (ForeignKey) внешних ключей и их соответствующие таблицы (TableWithFK).

Кинга Идем в IT: пошаговый план для смены профессии

Системные хранимые процедуры: как получить список внешних ключей мгновенно

Для того чтобы сразу же увидеть все внешние ключи, ссылающиеся на вашу таблицу, используйте системную хранимую процедуру sp_fkeys:

SQL
Скопировать код
EXEC sp_fkeys @pktable_name = 'YourTable', @pktable_owner = 'dbo' -- укажите схему и имя вашей таблицы

Таким образом, вы сможете вывести имена связанных таблиц, столбцов и получить другую важную информацию. Для работы с несколькими схемами нужно указать параметр @pktable_owner, чтобы предоставить точные результаты.

Сценарии для углубленного изучения

Для детального из изучения связей внешних ключей может быть полезен следующий SQL-скрипт:

SQL
Скопировать код
SELECT 
    o.name AS FK_name,
    SCHEMA_NAME(o.schema_id) AS SchemaName,
    t.name AS TableName,
    c.name AS ColumnName,
    SCHEMA_NAME(rt.schema_id) AS ReferencedSchemaName,
    rt.name AS ReferencedTableName,
    rc.name AS ReferencedColumnName
FROM 
    sys.foreign_key_columns fk
INNER JOIN 
    sys.objects o ON fk.constraint_object_id = o.object_id
INNER JOIN 
    sys.tables t ON fk.parent_object_id = t.object_id
INNER JOIN 
    sys.columns c ON fk.parent_object_id = c.object_id AND fk.parent_column_id = c.column_id
INNER JOIN 
    sys.tables rt ON fk.referenced_object_id = rt.object_id
INNER JOIN 
    sys.columns rc ON fk.referenced_object_id = rc.object_id AND fk.referenced_column_id = rc.column_id
WHERE 
    rt.name = 'YourTable'  -- замените на имя вашей таблицы
ORDER BY 
    SchemaName, TableName, FK_name, ColumnName; -- сортировка для удобства

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

Предосторожности перед вносом изменений

Пред началом глобальных изменений, таких как удаление таблицы, необходимо выяснить связи и зависимости, чтобы сохранить целостность данных:

SQL
Скопировать код
EXEC sp_help 'YourTable'; -- ничего не вредит так, как упущенная зависимость

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

Визуализация

Для визуализации внешних ключей, которые ссылаются на таблицу, можно представить замок (🏰). Попробуем найти все мосты (🌉), которые ведут к нему:

Markdown
Скопировать код
(🏭) --🌉--> 🏰
(🏠) --🌉--> 🏰
(🏛️) --🌉--> 🏰

Каждый мост — это внешний ключ из другой таблицы (🏭, 🏠, 🏛️), который ссылается на основной замок (🏰).

Markdown
Скопировать код
**Выявляем мосты** (внешние ключи):
SQL
Скопировать код
SELECT f.name AS ForeignKey,
       OBJECT_NAME(f.parent_object_id) AS TableName,
       COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
       OBJECT_NAME (f.referenced_object_id) AS ReferencedTable
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc 
    ON f.OBJECT_ID = fc.constraint_object_id
WHERE OBJECT_NAME(f.referenced_object_id) = 'CastleTable'

После выполнения этого запроса мы видим все пути, которые ведут к нашему замку (🏰), в базе данных королевства.

Целевые решения по конкретным запросам

В зависимости от специфических запросов к базе данных, возможно, вам потребуется адаптировать эти скрипты:

  • Фильтрация по схеме: Дополнительные условия WHERE могут помочь фильтровать результаты, относящиеся к определённой схеме.
  • Создание дерева зависимостей: Вы можете создать дерево зависимостей, рекурсивно соединяя объект sys.foreign_keys.
  • Интеграция с визуальными инструментами: Эти скрипты могут быть интегрированы в графические среды, такие как SSMS или ApexSQL Search, для лучшего визуального представления объектов и их зависимостей.

Проверка совместимости с различными версиями SQL Server

Убедитесь, что ваша версия сервера поддерживает все представленные методы. Например, SQL Server 2008 может не поддерживать некоторые функции, доступные в более новых версиях, но эти скрипты разработаны так, чтобы быть эффективными на любой версии.

Полезные материалы

  1. sys.foreign_keys (Transact-SQL) – SQL Server | Microsoft Learn — Детальная документация о представлении sys.foreign_keys.
  2. sys.foreign_key_columns (Transact-SQL) – SQL Server | Microsoft Learn — Важная информация о соответствии столбцов внешних ключей в SQL Server.
  3. How can I list all foreign keys referencing a given table in SQL Server? – Stack Overflow — Вопрос, заданный сообществом, с множеством детальных ответов на тему перечисления внешних ключей.
  4. SQL Server: How to Check for Foreign Key References – Brent Ozar Unlimited® — Несмотря на то, что информация на странице в данный момент недоступна, это источник знаний, если вновь станет доступной.
  5. Working with foreign key relationships in SQL Server – SQL Shack — Сейчас вы увидите ошибку "Страница не найдена", но в будущем страница может стать источником ценной информации, если её доступ восстановят.