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

6.5.1. Ограничения команды ALTER SYSTEM
6.5.2. Ограничения команды ALTER TABLE
6.5.3. Ограничения команды CREATE TABLE
6.5.4. Ограничения команды DROP TABLE
6.5.5. Ограничения команды CREATE INDEX CONCURRENTLY
6.5.6. Ограничения команды UPDATE
6.5.7. Ограничения команды INSERT ON CONFLICT DO UPDATE
6.5.8. Ограничения управления глобальными ролями
6.5.9. Ограничения команды ALTER SCHEMA
6.5.10. Ограничения команды DROP SERVER
6.5.11. Ограничения использования пользовательских баз данных
6.5.12. Ограничения команды CREATE COLLATION
6.5.13. Прочие ограничения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Использование ограничений DEFERRABLE для глобальных таблиц запрещено.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6.5.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.5.8. Ограничения управления глобальными ролями

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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