поиск внешних ключей в ms sql server с помощью information_schema

#sql-server #sql-server-2008 #foreign-keys #information-schema

#sql-сервер #sql-server-2008 #внешние ключи #информация-схема

Вопрос:

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

 select t1.TABLE_NAME as pointsfrom, t2.TABLE_NAME as pointsto
        from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS r
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS t1 on t1.CONSTRAINT_NAME=r.CONSTRAINT_NAME
        join INFORMATION_SCHEMA.TABLE_CONSTRAINTS t2 on t2.CONSTRAINT_NAME=r.UNIQUE_CONSTRAINT_NAME
        where t2.table_name = @mytable
  

Это работает в 90% случаев, или, если быть точным, для 22 из 24 внешних ключей в базе данных, над которой я работаю. Но для 2 FKS имя_универсального ограничения_имя не совпадает ни с одним именем в table_constraints.

Названия тоже немного забавные. Одним из них является «обозначение среды» с пробелом. Поле, на которое указывает FK, называется «environment_designator» с подчеркиванием. Другой имеет unique_constraint_name типа «filename is unique», который не соответствует ничему, что я вижу в определении таблицы «from» или «кому».

Есть ли еще какое-нибудь место, где я должен искать совпадение по unique_constraint_name?

Ответ №1:

Попробуйте это:

 SELECT OBJECT_NAME(parent_object_id), OBJECT_NAME(referenced_object_id)
    FROM sys.foreign_keys
    WHERE referenced_object_id = OBJECT_ID(@mytable)
  

Комментарии:

1. Что ж, похоже, это действительно работает. Я надеялся на решение с использованием information_schema, потому что (а) я уже использую information_schema в другом месте этого приложения, и я хотел бы быть последовательным; и (б) я никогда не использовал таблицы каталога sys и просто не хотел вникать в это. Но то, что работает, всегда предпочтительнее того, что не работает, поэтому я думаю, что воспользуюсь вашим решением. Если кто-то еще придет и знает способ заставить это работать с information_schema, пожалуйста, напишите! Я сомневаюсь, что переключусь обратно, если решение sys cat сработает, но пытливые умы хотят знать.

2. @Jay Смотрите Дело против представлений INFORMATION_SCHEMA для получения дополнительной информации.

3. Да, я думаю, что я это понимаю. Что ж, я сомневаюсь, что буду переделывать существующий рабочий код, думаю, в следующий раз я просто использую объекты, специфичные для SQL Server. У меня была эта глупая идея, что лучше использовать information_schema, потому что это должно быть промышленным стандартом.