ALTER SYSTEMALTER TABLECREATE TABLEDROP TABLECREATE INDEX CONCURRENTLYUPDATEINSERT ON CONFLICT DO UPDATEALTER SCHEMADROP SERVERCREATE COLLATIONВ целях обеспечения согласованности сегментированной базы данных, Shardman ограничивает возможности некоторых выполняемых SQL-команд.
ALTER SYSTEMALTER SYSTEM запрещена (изменение конфигурации должно выполняться через shardmanctl config update).
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.
Задание параметров хранения разрешено для глобальных таблиц.
CREATE TABLEПрименяются те же ограничения, что и для команды ALTER TABLE.
Использование невстроенных типов (типов со значениями OID >= 10000) или небазовых типов или массивов в столбцах «distributed_by» запрещено.
Только глобальный пользователь может создавать сегментированные или глобальные таблицы.
Использование ограничений DEFERRABLE для глобальных таблиц запрещено.
В совмещённой таблице количество и типы столбцов, используемых для секционирования таблицы, должны быть такими же, как и в таблице для совместного размещения.
Нельзя создать временную сегментированную или глобальную таблицу.
DROP TABLEСегментированные или глобальные таблицы и локальные таблицы нельзя удалять одновременно в одном операторе.
Нельзя удалять секции сегментированной таблицы.
CREATE INDEX CONCURRENTLYCREATE INDEX CONCURRENTLY — это нетранзакционная команда. Если при построении индекса для сегментированной или глобальной таблицы возникает проблема, такая как сбой сети, взаимоблокировка или нарушение уникальности в уникальном индексе, CREATE INDEX CONCURRENTLY выполнится частично неверно, но может оставить после себя рабочие или нерабочие индексы в узлах кластера Shardman. Также в некоторых узлах может полностью отсутствовать индекс. В последнем случае команда DROP INDEX не будет работать. Рекомендуемый способ удаления такого индекса для всего кластера — использовать команду DROP INDEX IF EXISTS. Обратите внимание, что DROP INDEX CONCURRENTLY не поддерживается для сегментированных таблиц, поэтому эту операцию лучше выполнять в период обслуживания.
UPDATEКоманда UPDATE для сегментированной таблицы выполняется как серия обычных команд UPDATE, если она не перемещает данные между секциями или подсекциями. В противном случае она выполняется внутри как удаление (DELETE) из одной секции и вставка (INSERT) в другую (так называемую целевую секцию). Если секция, в которую UPDATE добавляет данные (INSERT), изменяется в том же операторе, возникнет ошибка. На практике это означает, что если UPDATE перемещает данные между секциями, нужно явно исключить целевую секцию из изменения в предложении WHERE оператора.
INSERT ON CONFLICT DO UPDATEКоманда INSERT INTO не поддерживается для сторонних таблиц, когда conflict_target это имя_таблицы... ON CONFLICT [conflict_target] conflict_action [WHERE condition]DO UPDATE. Поддерживается для сегментированных таблиц, если выражения в предложениях SET и WHERE могут быть безопасно разобраны (в настоящее время разбор sqlvalue-функций, параметров и подзапросов внутри этих предложений не поддерживается) и если нечастичный уникальный индекс, содержащий только столбцы таблицы (но не выражения на основе столбцов), соответствует выражению conflict_target. Обычно этим критериям соответствует первичный ключ таблицы.
Глобальных пользователей может создавать только пользователь с разрешением CREATEROLE на всех узлах кластера.
Глобальные роли не могут быть переименованы.
Глобальные и локальные роли нельзя удалить одновременно в одном операторе.
GRANT для локальной и глобальной роли в одном операторе запрещён.
REVOKE от локальной и глобальной роли в одном операторе запрещён.
ALTER SCHEMAСхемы, содержащие глобальные или сегментированные таблицы, нельзя переименовывать. Служебные схемы Shardman (shardman и shardman_internal) нельзя переименовывать или удалять.
DROP SERVERСерверы кластера Shardman не могут быть удалены. Используйте инструменты Shardman для удаления серверов из кластера.
CREATE COLLATIONЕсли используются пользовательские правила сортировки, на всех серверах должна быть установлена одна и та же версия icu. В противном случае результаты запросов к сегментированным таблицам могут быть некорректными.
Команда DROP TYPE CASCADE запрещена, если она влияет на типы, используемые в глобальных или сегментированных таблицах.