1

我们使用 SSDT 来部署我们的数据库更改。我们有一个每周重新创建索引的脚本。我们的脚本如下所示:

declare @cmd varchar(max)
set @cmd = '
CREATE NONCLUSTERED INDEX [iAudit-ModifiedDateTime] ON [dbo].[Audit]
(
[ModifiedDateTime] ASC
)
WHERE ModifiedDateTime > ''###''
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY]
'
set @cmd = replace(@cmd, '###', convert(varchar(8), dateadd(day, -3, getdate()), 112))
exec (@cmd)

不幸的是,当我们运行 SSDT 来更新数据库时,它会将索引更改为项目中的定义,或者在不包含时将其删除。有什么办法可以解决这个问题吗?我们需要过滤索引的原因是要将具有数百万行的审计表中的最新记录添加到数据仓库中。

4

1 回答 1

2

有一些选项,按复杂程度排列:

  • 不要在项目中包含索引定义并禁用“删除不在源中的索引”选项。在 Visual Studio 中,可以在“发布”对话框的“高级选项”对话框中找到它。使用SqlPackage.exe发布时,可以使用参数/p:DropIndexesNotInSource=false
  • 不要在项目中包含索引定义,将索引创建脚本放入部署后脚本中。这将确保在部署架构更新后始终重新创建索引。
  • 使用社区创作的部署贡献者过滤掉对此索引的修改。见https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-Deployments
  • 创建部署贡献者以过滤掉对此索引的修改。请参阅https://github.com/Microsoft/DACExtensions/
于 2016-07-01T02:33:53.670 回答