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

时间:2018-02-13 00:49:35

标签: sql-server sql-server-2017 ssms-17

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

我已经安装了WorldWideImporters示例数据库。其中一个表Sales.Customers有几个外键和几个外键索引。在编写表脚本(脚本表,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约束条形。然后我从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

到目前为止,非常好。

但后来我在FK栏上添加了关于foo的索引。

CREATE NONCLUSTERED INDEX FK_bar ON foo (foobar_id)

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

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

1 个答案:

答案 0 :(得分:2)

默认情况下,SSMS中的索引编写处于关闭状态。就个人而言,这是我重新开启脚本权限和触发器的第一件事。您可以通过以下方式找到此设置:

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