Почему в скриптах, создаваемых SSMS, отсутствуют индексы?
SSMS 17.4, выпуск SQL Server 2017 для разработчиков на Win10 1709
Я установил пример базы данных WorldWideImporters. Одна из таблиц, Sales.Customers, имеет несколько внешних ключей и несколько индексов внешних ключей. При создании сценария таблицы (Script Table, CREATE To…) сценарий включает внешние ключи, но не индексы внешнего ключа. Если я просто изменяю имя таблицы и запускаю сгенерированный скрипт, таблица создается со всеми ограничениями FK, но без индексов FK.
Что-то, что вы можете увидеть, даже если у вас нет образца WWI, я сделал это.
CREATE TABLE bar (
bar_id int,
col1 varchar(20),
CONSTRAINT pk_bar PRIMARY KEY CLUSTERED (bar_id)
)
CREATE TABLE foo (
foo_id int,
foobar_id int,
col1 varchar(20),
CONSTRAINT pk_foo PRIMARY KEY CLUSTERED (foo_id)
)
ALTER TABLE foo WITH CHECK
ADD CONSTRAINT FK_bar FOREIGN KEY (foobar_id) REFERENCES bar (bar_id)
ALTER TABLE foo CHECK CONSTRAINT FK_bar
Это создает две таблицы с foo, имеющим ограничение FK на bar. Затем я написал скрипт из SSMS.
CREATE TABLE [dbo].[foo](
[foo_id] [int] NOT NULL,
[foobar_id] [int] NULL,
[col1] [varchar](20) NULL,
CONSTRAINT [pk_foo] PRIMARY KEY CLUSTERED
(
[foo_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [USERDATA]
) ON [USERDATA]
GO
ALTER TABLE [dbo].[foo] WITH CHECK ADD CONSTRAINT [FK_bar] FOREIGN KEY([foobar_id])
REFERENCES [dbo].[bar] ([bar_id])
GO
ALTER TABLE [dbo].[foo] CHECK CONSTRAINT [FK_bar]
GO
Все идет нормально.
Но затем я добавил индекс foo в столбец FK.
CREATE NONCLUSTERED INDEX FK_bar ON foo (foobar_id)
Создание сценария для таблицы приводит к тому же сценарию, что и выше. Таким образом, SSMS создает один и тот же сценарий независимо от того, есть индекс в столбце FK или нет. (Я подтвердил с помощью sp_helpindex, что индекс FK действительно существует.)
Это ошибка в SSMS или я что-то неправильно понимаю?
1 ответ
Сценарии индекса отключены по умолчанию в SSMS. Лично это одна из первых вещей, которую я снова включаю вместе с разрешениями и триггерами сценариев. Вы можете найти эту настройку:
- В SSMS откройте меню "Сервис" и выберите "Параметры".
- Прокрутите вниз до Проводника объектов SQL Server и раскройте дерево
- Нажмите на узел Scripting и измените индексы скрипта на true