为什么 SSMS 生成的脚本缺少索引?

Why is SSMS-produced script missing indexes?

SSMS 17.4,SQL Win10 1709 上的 Server 2017 开发者版

我已经安装了 WorldWideImporters 示例数据库。 table 之一,Sales.Customers,有几个外键和几个外键索引。在编写 table 脚本时(脚本 Table,创建到...),脚本包括外键,但不包括外键索引。如果我只是更改生成脚本的 table 和 运行 的名称,则 table 是使用所有 FK 约束创建的,但 FK 索引的 none。

对于即使您没有安装 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

这将创建两个 table,其中 foo 具有对 bar 的 FK 约束。然后我从 SSMS 编写了 table 脚本。

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

到目前为止,还不错。

但后来我在 FK 列的 foo 上添加了一个索引。

CREATE NONCLUSTERED INDEX FK_bar ON foo (foobar_id)

编写 table 脚本然后生成与上面完全相同的脚本。因此,无论 FK 列上是否有索引,SSMS 都会生成相同的脚本。 (我用 sp_helpindex 确认 FK 索引确实存在。)

这是 SSMS 中的错误还是我误解了什么?

在 SSMS 中默认关闭索引脚本。就个人而言,这是我与脚本权限和触发器一起重新打开的第一件事。您可以通过以下方式找到此设置:

  1. 在 SSMS 中,打开“工具”菜单并选择“选项”
  2. 向下滚动到 SQL 服务器对象资源管理器并展开树
  3. 单击脚本节点并将脚本索引更改为 true