При конвертации на 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. |