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. Ограничения сопоставлений пользователей
- 6.6.10. Ограничения команды
ALTER SCHEMA- 6.6.11. Ограничения команды
DROP SERVER- 6.6.12. Ограничения использования пользовательских баз данных
- 6.6.13. Ограничения команды
CREATE COLLATION- 6.6.14. Ограничения логической репликации
- 6.6.15. Прочие ограничения
- 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
Для команды
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
Сегментированные глобальные или локальные таблицы нельзя удалить командой
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 ON CONFLICT DO UPDATEне поддерживается для сторонних таблиц, когда 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. Ограничения сопоставлений пользователей
Команды
CREATE USER MAPPING,ALTER USER MAPPING, andDROP USER MAPPINGзапрещены, если сопоставление происходит для сторонних серверов и кластера Shardman. Вместо этого используйте механизмы Shardman, описанные в разделе Управление пользователями и ролями.
6.6.10. Ограничения команды ALTER SCHEMA
Схемы, содержащие глобальные или сегментированные таблицы, нельзя переименовывать с помощью команды
ALTER SCHEMA. Служебные схемы Shardman (shardman) нельзя переименовывать или удалять.
6.6.11. Ограничения команды DROP SERVER
Серверы кластера Shardman не могут быть удалены командой
DROP SERVER. Используйте инструменты Shardman для удаления серверов из кластера.
6.6.12. Ограничения использования пользовательских баз данных
Работа с пользовательскими базами данных не поддерживается. В ходе работы shardmanctl все локальные пользовательские базы данных могут быть повреждены или потеряны.
6.6.13. Ограничения команды CREATE COLLATION
Если используются пользовательские правила сортировки с помощью команды
CREATE COLLATION, на всех серверах должна быть установлена одна и та же версия icu. В противном случае результаты запросов к сегментированным таблицам могут быть некорректными.
6.6.14. Ограничения логической репликации
Попытка публикации таблицы, содержащей сторонние секции, с указанием параметра
publish_via_partition_rootзавершится ошибкой. Без этого параметра в публикацию будут включены только локальные секции.При использовании
FOR TABLES IN SCHEMAилиFOR ALL TABLESбудут публиковаться только локальные секции.Из публикации с
FOR TABLES IN SCHEMA WITHилиFOR ALL TABLESвместе с параметромpublish_via_partition_rootисключаются любые таблицы со сторонними секциями. Добавление сторонних секций в таблицы, включённые в публикации сpublish_via_partition_root, также приведёт к ошибке.При выполнении
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONтаблицы могут добавляться или удаляться из публикации в зависимости от изменений секций.При использовании
FOR ALL TABLESиз публикации исключаются таблицы схемыshardman. При этом можно создать публикацию для всех таблиц этой схемы или для отдельных таблиц.
6.6.15. Прочие ограничения
Команда
DROP TYPE CASCADEзапрещена, если она влияет на типы, используемые в глобальных или сегментированных таблицах.Управление правами доступа на глобальные таблицы на уровне столбцов не поддерживается.