【问题标题】:Why is SSMS-produced script missing indexes?为什么 SSMS 生成的脚本缺少索引?
【发布时间】:2018-02-13 00:49:35
【问题描述】:

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

我已经安装了 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 具有对 bar 的 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 中的错误还是我误解了什么?

【问题讨论】:

  • SSMS 设置中有一个脚本选项列表,默认情况下可能会关闭索引(目前无法检查)。

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


【解决方案1】:

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

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

【讨论】:

  • 哇。我从 SQL2K 开始就使用 SSMS,我从来没有见过(我不使用对象资源管理器,所以从不打扰它),而且我不记得以前没有索引的脚本。在最新版本的 SSMS 中,该默认值是否发生了变化?无论如何,非常感谢。
  • @vr8ce 从我记事起就一直这样。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多