#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, что ж, это еще проще.