为什么 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 中默认关闭索引脚本。就个人而言,这是我与脚本权限和触发器一起重新打开的第一件事。您可以通过以下方式找到此设置:
- 在 SSMS 中,打开“工具”菜单并选择“选项”
- 向下滚动到 SQL 服务器对象资源管理器并展开树
- 单击脚本节点并将脚本索引更改为 true
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 中默认关闭索引脚本。就个人而言,这是我与脚本权限和触发器一起重新打开的第一件事。您可以通过以下方式找到此设置:
- 在 SSMS 中,打开“工具”菜单并选择“选项”
- 向下滚动到 SQL 服务器对象资源管理器并展开树
- 单击脚本节点并将脚本索引更改为 true