6.6. Ограничения SQL

В целях обеспечения согласованности сегментированной базы данных, Shardman ограничивает возможности некоторых выполняемых SQL-команд.

6.6.1. Ограничения команды ALTER SYSTEM

  • ALTER SYSTEM запрещена (изменение конфигурации должно выполняться через shardmanctl config update).

6.6.2. Ограничения команды ALTER TABLE

  • Команда ALTER TABLE запрещена для секций сегментированных таблиц.

  • Все формы команды ALTER TABLE запрещены для сегментированных или глобальных таблиц, за исключением следующих:

    • Команда ALTER TABLE OWNER разрешена. Для сегментированной таблицы эта команда также меняет владельца секций таблицы. Только глобальный пользователь может быть владельцем сегментированной или глобальной таблицы.

    • Для команды ALTER TABLE COLUMN TYPE существуют следующие ограничения. Нельзя изменить тип столбца сегментированной таблицы, участвующего в сегментировании или ключе секционирования. Нельзя изменить тип столбца сегментированной таблицы с помощью предложения USING (но это разрешено для глобальных таблиц). Кроме того, на данный момент пользователь должен самостоятельно создавать и поддерживать точное равенство новых типов на каждом узле кластера.

    • Разрешена команда ALTER TABLE COLUMN RENAME.

    • Допускается добавление или удаление уникальных ограничений и проверок для всей таблицы. Для глобальных таблиц запрещено удаление ограничения первичного ключа или удаление столбцов, являющихся частью первичного ключа.

    • Добавление внешних ключей между сегментированными таблицами возможно только в том случае, если они размещены совместно и внешний ключ ссылается на кортежи, которые хранятся в той же группе репликации. Внешний ключ между сегментированными таблицами должен начинаться со столбцов, используемых для секционирования в обеих таблицах. Внешний ключ в глобальной таблице может ссылаться только на другую глобальную таблицу. Внешний ключ в сегментированной таблице может ссылаться на совмещённую сегментированную таблицу или глобальную таблицу.

    • Разрешены действия SET/DROP NOT NULL.

    • Задание параметров хранения разрешено для глобальных таблиц.

    • Глобальные таблицы не могут наследовать другие таблицы.

    • Команда ALTER COLUMN SET STATISTICS разрешена для глобальных и сегментированных таблиц.

6.6.3. Ограничения команды CREATE TABLE

  • Применяются те же ограничения, что и для команды ALTER TABLE.

  • Использование невстроенных типов (типов со значениями OID >= 10000) или небазовых типов или массивов в столбцах «distributed_by» запрещено.

  • Только глобальный пользователь может создавать сегментированные или глобальные таблицы.

  • В совмещённой таблице количество и типы столбцов, используемых для секционирования таблицы, должны быть такими же, как и в таблице для совместного размещения.

  • Нельзя создать временную сегментированную или глобальную таблицу.

  • Следующие ограничения применяются к таблицам, созданным с помощью LIKE исходная_таблица, где исходная_таблица является локальной:

    • Копирование без предложения вариант_копирования или с INCLUDING INDEXES поддерживается.

    • С помощью INCLUDING INDEXES копируются только уникальные индексы и индексы с поддержкой первичного ключа отношения.

    • Копирование индексов для столбцов не поддерживается.

    • Использование ограничений EXCLUDE не поддерживается.

    • У локальных таблиц в команде CREATE TABLE LIKE должны быть только столбцы базовых типов.

    • Частичные индексы не поддерживаются.

    • Поддерживаются только стандартные правила сортировки.

    • Ограничение по NULLS NOT DISTINCT не поддерживается.

6.6.4. Ограничения команды DROP TABLE

  • Сегментированные или глобальные таблицы и локальные таблицы нельзя удалять одновременно в одном операторе.

  • Нельзя удалять секции сегментированной таблицы.

6.6.5. Ограничения команды CREATE INDEX CONCURRENTLY

  • CREATE INDEX CONCURRENTLY — это нетранзакционная команда. Если при построении индекса для сегментированной или глобальной таблицы возникает проблема, такая как сбой сети, взаимоблокировка или нарушение уникальности в уникальном индексе, CREATE INDEX CONCURRENTLY выполнится частично неверно, но может оставить после себя рабочие или нерабочие индексы в узлах кластера Shardman. Также в некоторых узлах может полностью отсутствовать индекс. В последнем случае команда DROP INDEX не будет работать. Рекомендуемый способ удаления такого индекса для всего кластера — использовать команду DROP INDEX IF EXISTS. Обратите внимание, что DROP INDEX CONCURRENTLY не поддерживается для сегментированных таблиц, поэтому эту операцию лучше выполнять в период обслуживания.

6.6.6. Ограничения команды UPDATE

  • Команда UPDATE для сегментированной таблицы выполняется как серия обычных команд UPDATE, если она не перемещает данные между секциями или подсекциями. В противном случае она выполняется внутри как удаление (DELETE) из одной секции и вставка (INSERT) в другую (так называемую целевую секцию). Если секция, в которую UPDATE добавляет данные (INSERT), изменяется в том же операторе, возникнет ошибка. На практике это означает, что если UPDATE перемещает данные между секциями, нужно явно исключить целевую секцию из изменения в предложении WHERE оператора.

6.6.7. Ограничения команды INSERT ON CONFLICT DO UPDATE

  • Команда INSERT INTO имя_таблицы... ON CONFLICT [conflict_target] conflict_action [WHERE condition] не поддерживается для сторонних таблиц, когда conflict_target это DO UPDATE. Поддерживается для сегментированных таблиц, если выражения в предложениях SET и WHERE могут быть безопасно разобраны (в настоящее время разбор sqlvalue-функций, параметров и подзапросов внутри этих предложений не поддерживается) и если нечастичный уникальный индекс, содержащий только столбцы таблицы (но не выражения на основе столбцов), соответствует выражению conflict_target. Обычно этим критериям соответствует первичный ключ таблицы.

6.6.8. Ограничения управления глобальными ролями

  • Глобальных пользователей может создавать только пользователь с разрешением CREATEROLE на всех узлах кластера.

  • Глобальные роли не могут быть переименованы.

  • Глобальные и локальные роли нельзя удалить одновременно в одном операторе.

  • GRANT для локальной и глобальной роли в одном операторе запрещён.

  • REVOKE от локальной и глобальной роли в одном операторе запрещён.

6.6.9. Ограничения команды ALTER SCHEMA

  • Схемы, содержащие глобальные или сегментированные таблицы, нельзя переименовывать. Служебные схемы Shardman (shardman и shardman_internal) нельзя переименовывать или удалять.

6.6.10. Ограничения команды DROP SERVER

  • Серверы кластера Shardman не могут быть удалены. Используйте инструменты Shardman для удаления серверов из кластера.

6.6.11. Ограничения использования пользовательских баз данных

  • Работа с пользовательскими базами данных не поддерживается. В ходе работы shardmanctl все локальные пользовательские базы данных могут быть повреждены или потеряны.

6.6.12. Ограничения команды CREATE COLLATION

  • Если используются пользовательские правила сортировки, на всех серверах должна быть установлена одна и та же версия icu. В противном случае результаты запросов к сегментированным таблицам могут быть некорректными.

6.6.13. Ограничения логической репликации

  • Попытка публикации таблицы, содержащей сторонние секции, с указанием параметра publish_via_partition_root завершится ошибкой. Без этого параметра в публикацию будут включены только локальные секции.

  • При использовании FOR TABLES IN SCHEMA или FOR ALL TABLES будут публиковаться только локальные секции.

  • Из публикации с FOR TABLES IN SCHEMA WITH или FOR ALL TABLES вместе с параметром publish_via_partition_root исключаются любые таблицы со сторонними секциями.

  • При выполнении ALTER SUBSCRIPTION ... REFRESH PUBLICATION таблицы могут добавляться или удаляться из публикации в зависимости от изменений секций.

  • При использовании FOR ALL TABLES из публикации исключаются таблицы схемы shardman. При этом можно создать публикацию для всех таблиц этой схемы или для отдельных таблиц.

6.6.14. Прочие ограничения

  • Команда DROP TYPE CASCADE запрещена, если она влияет на типы, используемые в глобальных или сегментированных таблицах.

  • Управление правами доступа на глобальные таблицы на уровне столбцов не поддерживается.