Создать индекс с использованием Liquibase (ВКЛЮЧИТЬ СТОЛБЕЦ)

#sql #sql-server #liquibase

#sql #sql-сервер #liquibase

Вопрос:

Я хочу создать индекс в своей базе данных MSSQL, и индекс должен выглядеть следующим образом :

 CREATE NONCLUSTERED INDEX [table] ON [status] ([date]) INCLUDE ([id], [status]) WITH (ONLINE = ON)
  

Я обнаружил, что с опцией тега liquibase «sql» мы можем выполнить сценарий SQL, и я применил то же самое в своем сценарии liquibase:

 <changeSet  author="author"  id="15">  
    <sql  dbms="mssql"  schemaName="${SCHEMA_NAME}"
            endDelimiter="nGO"  
            splitStatements="true"  
            stripComments="true">CREATE NONCLUSTERED INDEX [table] ON [status] ([date]) INCLUDE ([id], [status]) WITH (ONLINE = ON)
     </sql>  
</changeSet> 
  

Но проблема в том, что приведенный выше набор изменений работает только с корпоративной базой данных.

 Reason: liquibase.exception.DatabaseException: Online index operations can only be performed in Enterprise edition of SQL Server.
  

Кто-нибудь, знает, как я могу выполнить ту же задачу, используя параметр CREATEINDEX набора изменений liquibase.

Комментарии:

1. Как это довольно часто бывает с MS SQL Server, сообщение об ошибке, которое вы получаете от database engine, содержит как объяснение, так и обходной путь.

2. @RogerWolf Я понял о проблеме, что это может быть возможно только в Enterprise Edition, но я не понимаю, что можно обойти?

Ответ №1:

Как указано в сообщении об ошибке,

Операции с онлайн-индексацией могут выполняться только в корпоративной версии SQL Server.

Чтобы заставить его работать, все, что вам нужно сделать, это удалить ONLINE предложение из вашего create index заявления:

 CREATE NONCLUSTERED INDEX [table] ON [status] ([date]) INCLUDE ([id], [status]);
  

Это будет работать в любой редакции. В то же время, если вы хотите иметь возможность использовать онлайн-создание индекса и перестроить его, когда это позволяет редакция, вы можете проверить версию ядра базы данных, к которому подключается ваше приложение, а затем при необходимости добавить поддерживаемые предложения, такие как online в этом случае.

В вашем примере оперативная перестройка индекса доступна только в Enterprise Edition, однако версии для разработки и оценки функционально эквивалентны ей, поэтому в них также доступны операции с онлайн-индексацией.

Вот способ определения функционального уровня вашего экземпляра SQL Server:

 select serverproperty('EngineEdition');
  

Это дает вам фактические возможности вашего экземпляра, независимо от лицензирования. Сравнивая результат этого запроса с документированными значениями, которые он может возвращать, вы можете принять решение о том, какие параметры он поддерживает, и включить подходящие части в свой запрос перед его выполнением.

Комментарии:

1. Свойство server можно использовать в Liquibase для создания предварительного условия для набора изменений и запуска различных инструкций CREATE INDEX на основе редакции

2. @a_horse_with_no_name, я не знаком с Liquibase, поэтому я просто описал наиболее общий подход, не зависящий от каких-либо особенностей платформы. Если это делает Liquibase, что ж, это еще проще.