При конвертации на Modern-конфигурацию серверной части пересоздайте таблицы, в которых планируется использовать фильтрованные индексы:
1. | В контекстном меню базы данных выберите пункты Tasks\Generate Scripts…. Откроется мастер действий Generate and Publish Scripts. |
2. | На закладке Choose Objects выберите исходную таблицу, например, SBFolder, и нажмите на кнопку Next >. |
3. | На закладке Set Scripting Options выберите переключатель Save to query window и нажмите на кнопку Advanced. Откроется окно Advanced Scripting Options. |
4. | В разделе Table/View Options установите значение True для настроек: |
• | Script Check Constraints |
• | Script Full-Text Indexes |
• | Script Object-Level Permissions |
Нажмите на кнопку OK.
Примечание
В базах данных, развернутых на SQL Server 2012 и ниже с уровнем совместимости ниже 100, установите значение False для настройки Script Full-Text Indexes, т.к. SQL Server Management Studio не всегда корректно формирует скрипт для создания полнотекстового индекса. Подробнее см. в документации Microsoft. После пересоздания таблицы выполните сценарий Индексирование текстов и слепков объектов.
5. | Нажмите на кнопку Next >. |
6. | Проверьте значение параметра соединения SET ANSI_NULLS ON. |
7. | В инструкции CREATE TABLE: |
• | замените название таблицы на временное, например, «SBFolder_»; |
• | замените названия ключей на временные: |
CREATE TABLE [dbo].[SBFolder_](
[Name] [varchar](255) NOT NULL,
[Author] [int] NOT NULL,
[CreateDate] [datetime] NOT NULL,
[EditDate] [datetime] NOT NULL,
[Kind] [varchar](1) NOT NULL,
[FolderType] [varchar](1) NOT NULL,
[Note] [varchar](255) NULL,
[XRecID] [int] NOT NULL,
[SearchDescription] [image] NULL,
[URL] [varchar](2048) NULL,
[ShowUnread] [varchar](1) NOT NULL,
[ShowCoverOnly] [varchar](1) NOT NULL,
[timestamp] [timestamp] NOT NULL,
[ManagedFolderID] [int] NULL,
CONSTRAINT [SBFolder_PK_] PRIMARY KEY NONCLUSTERED
([XRecID] ASC) WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
8. | Замените названия индексов в инструкциях CREATE <UNIQUE> <CLUSTERED> INDEX на временное название для новой таблицы: |
CREATE UNIQUE CLUSTERED INDEX [SBFolder_Author_Idx_] ON [dbo].[SBFolder_]
([Author] ASC,
[FolderType] ASC,
[XRecID] ASC
) WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80)
ON [PRIMARY]
9. | Если используется инструкция CREATE FULLTEXT INDEX ON, то перед ней удалите индекс полнотекстового поиска у исходной таблицы, иначе возникнет ошибка в методе Switch to: |
if exists (
select
1
from
sys.tables tbl
join sys.fulltext_indexes fti on
fti.object_id = tbl.object_id
where
tbl.object_id = object_id('SBFolder'))
drop fulltext index on [dbo].[SBFolder]
10. | После создания индексов и до инструкций ALTER TABLE добавьте скрипт переключения данных: |
alter table [dbo].[SBFolder] switch to [dbo].[SBFolder_]
go
11. | Добавьте скрипт перестроения счетчика идентификатора: |
if ident_current(N'SBFolder') is not null
dbcc checkident(N'SBFolder_')
go
12. | Добавьте скрипт удаления исходной таблицы: |
drop table [dbo].[SBFolder]
go
13. | Добавьте скрипт переименования новой таблицы в исходную: |
execute sp_rename N'SBFolder_', N'SBFolder', N'object'
go
14. | Если были ключи или индексы переименуйте их как у исходной таблицы: |
execute sp_rename N'SBFolder.SBFolder_PK_', N'SBFolder_PK', N'INDEX'
execute sp_rename N'SBFolder.SBFolder_Author_Idx_', N'SBFolder_Author_Idx', N'INDEX'
go
15. | Добавьте инструкции создания ограничений, полнотекстовых индексов, триггеров, добавления расширенных свойств: |
CREATE FULLTEXT INDEX ON [dbo].[SBFolder](
[Name] LANGUAGE [Neutral])
KEY INDEX [SBFolder_PK]ON ([MBText_text], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
ALTER TABLE [dbo].[SBFolder] ADD CONSTRAINT [SBFolder_D_ShowUnread] DEFAULT ('N') FOR [ShowUnread]
ALTER TABLE [dbo].[SBFolder] ADD CONSTRAINT [SBFolder_D_ShowCoverOnly] DEFAULT ('N') FOR [ShowCoverOnly]
ALTER TABLE [dbo].[SBFolder] WITH NOCHECK ADD CONSTRAINT [SBFolder_C_FolderType] CHECK (([FolderType]='I' OR ([FolderType]='O' OR ([FolderType]='F' OR ([FolderType]='C' OR ([FolderType]='P' OR ([FolderType]='M' OR ([FolderType]='Q' OR ([FolderType]='S' OR [FolderType]='E')))))))))
ALTER TABLE [dbo].[SBFolder] CHECK CONSTRAINT [SBFolder_C_FolderType]
ALTER TABLE [dbo].[SBFolder] WITH NOCHECK ADD CONSTRAINT [SBFolder_C_Kind] CHECK (([Kind]='E' OR ([Kind]='T' OR ([Kind]='J' OR ([Kind]='C' OR [Kind]='A')))))
ALTER TABLE [dbo].[SBFolder] CHECK CONSTRAINT [SBFolder_C_Kind]
go
16. | Выполните скрипт и убедитесь, что в свойствах таблицы параметр соединения ANSI_NULLS имеет значение ON. |