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

В целях обеспечения согласованности сегментированной базы данных, 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.

    • Команды ADD COLUMN и DROP COLUMN разрешены, за исключением добавления столбцов типов small serial (SMALLSERIAL, SERIAL2, SERIAL и SERIAL4). Однако SERIAL8 и BIGSERIAL также поддерживаются.

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

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

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

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

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

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

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

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

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

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

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

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. Ограничения команды CREATE COLLATION

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

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

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