6.6. Ограничения SQL
- 6.6.1. Ограничения команды
ALTER SYSTEM
- 6.6.2. Ограничения команды
ALTER TABLE
- 6.6.3. Ограничения команды
CREATE TABLE
- 6.6.4. Ограничения команды
DROP TABLE
- 6.6.5. Ограничения команды
CREATE INDEX CONCURRENTLY
- 6.6.6. Ограничения команды
UPDATE
- 6.6.7. Ограничения команды
INSERT ON CONFLICT DO UPDATE
- 6.6.8. Ограничения управления глобальными ролями
- 6.6.9. Ограничения команды
ALTER SCHEMA
- 6.6.10. Ограничения команды
DROP SERVER
- 6.6.11. Ограничения использования пользовательских баз данных
- 6.6.12. Ограничения команды
CREATE COLLATION
- 6.6.13. Ограничения логической репликации
- 6.6.14. Прочие ограничения
- 6.6.2. Ограничения команды
В целях обеспечения согласованности сегментированной базы данных, 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
не поддерживается для сторонних таблиц, когда conflict_target этоимя_таблицы
... ON CONFLICT [conflict_target] conflict_action [WHERE condition]DO UPDATE
. Поддерживается для сегментированных таблиц, если выражения в предложенияхSET
иWHERE
могут быть безопасно разобраны (в настоящее время разбор sqlvalue-функций, параметров и подзапросов внутри этих предложений не поддерживается) и если нечастичный уникальный индекс, содержащий только столбцы таблицы (но не выражения на основе столбцов), соответствует выражению conflict_target. Обычно этим критериям соответствует первичный ключ таблицы.
6.6.8. Ограничения управления глобальными ролями
Глобальных пользователей может создавать только пользователь с разрешением
CREATEROLE
на всех узлах кластера.Глобальные роли не могут быть переименованы.
Глобальные и локальные роли нельзя удалить одновременно в одном операторе.
GRANT
для локальной и глобальной роли в одном операторе запрещён.REVOKE
от локальной и глобальной роли в одном операторе запрещён.
6.6.9. Ограничения команды ALTER SCHEMA
Схемы, содержащие глобальные или сегментированные таблицы, нельзя переименовывать. Служебные схемы Shardman (
shardman
) нельзя переименовывать или удалять.
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
запрещена, если она влияет на типы, используемые в глобальных или сегментированных таблицах.Управление правами доступа на глобальные таблицы на уровне столбцов не поддерживается.