Поиски в Google дали миллионы просмотров о том, как найти таблицы без кластеризованной индексации, причем PK обычно является кластерным индексом таблицы. Однако таблица может легко иметь естественный ключ в виде кластеризованного индекса и некластеризованный суррогатный индекс, например столбец идентификаторов.
Как найти все таблицы в БД без определения первичного ключа? У меня есть 245 таблиц в этой БД: ручная проверка крайне неэффективна.
sys.tables
сам дает идентификатор и спасибо за показ этой замечательной функции.objectproperty()
доступно с 2005 года, я только что проверил бол, верно?Решение Майка отлично подходит для конкретной проблемы.
Если вы хотите больше гибкости, вот альтернатива , которая может быть легко трансформировалась в запрос , который возвращает другую информация, например, найти все таблицы , которые кучи, или найти таблицы , которые не имеют ограничений уникальности на всех .
Когда ваша (подсистема) переходит ~ 50 таблиц, очень важно ознакомиться со всеми таблицами метаданных, потому что, как вы сказали, просмотр каждой таблицы вручную нецелесообразен (и подвержен ошибкам!).
источник
Функция управления политиками SQL Server может сделать это.
Фасет таблицы имеет поля @HasIndex и @HasClusteredIndex (а также другие, которые могут быть полезны, например, триггеры). Можно создать политику для проверки условий во всех таблицах, во всех базах данных на нескольких серверах (с помощью функции центрального сервера управления).
Однако он не может проверить наличие индекса или ограничения первичного ключа. Я бы поклялся, что есть поле @HasPrimaryKey, но его нет в MSSQL2012. Я либо вспоминаю, либо схожу с ума.
Примечание. Управление политиками входит в состав выпусков SQL Server 2012 Enterprise, Business Intelligence и Standard. Это не доступно в Экспресс-выпуске.
источник