Особенности работы с PostgreSQL
Glossary Item Box
Общие рекомендации
- Не рекомендуется использовать для создания триггеров, представлений, функций команду CREATE OR REPLACE. Вместо этого используйте конструкцию DROP … IF EXISTS (при необходимости можно использовать команду CASCADE), а затем CREATE OR REPLACE.
- Вместо схемы "dbo" используйте "public".
- Учитывайте регистрозависимость системных имен, используйте кавычки ("") для имен таблиц, колонок и т.д..
- Вместо типа BIT в MS SQL используйте в Postgres тип BOOL. Для проверки значения поля типа BOOL необязательно использовать конструкцию WHERE "boolColumn" = true, достаточно WHERE "boolColumn" или WHERE NOT "boolColumn".
- В Postgres можно использовать сокращенный вид явного преобразования ::TEXT.
- В Postgres при сравнении строк учитывается регистр. Для выполнения регистронезависимого сравнения можно использовать ключевое слово iLIKE. Однако учитывайте, что сравнение при этом значительно более медленное, чем при использовании комбинации UPPER+LIKE. Кроме того у комбинации UPPER+LIKE менее строгие правила применимости индексов, чем у iLIKE.
- Если нет какого-либо неявного приведения типов, то его можно создать с помощью команды CREATE CAST. Подробнее об этом читайте в документации PostgreSQL.
- В Postgres нет встроенной функции NESTLEVEL в рекурсивных процедурах. Для хранения текущего уровня рекурсии следует создавать специальный параметр процедуры.
- Вместо типа SYSNAME используйте тип NAME.
- Вместо пустых INSTEAD-триггеров создавайте правила, например:
CREATE RULE RU_VwAdministrativeObjects AS ON UPDATE TO "VwAdministrativeObjects" DO INSTEAD NOTHING;
- При выполнении команды UPDATE в Postgres не работает неявное преобразование типа INT в тип BOOL, даже при наличии соответствующего оператора CAST. Следует явно привести INT -значение к типу BOOL.
- Способы форматирования строковых литералов подробно описаны на сайте документации PostgreSQL:
- Вместо @@ROWCOUNT используйте следующую конструкцию:
DECLARE rowsCount BIGINT = 0; GET DIAGNOSTICS rowsCount = row_count;
- Вместо конструкции в MS SQL
(CASE WHEN EXISTS ( SELECT 1 FROM [SysSSPEntitySchemaAccessList] WHERE [SysSSPEntitySchemaAccessList].[EntitySchemaUId] = [BaseSchemas].[UId] ) THEN 1 ELSE 0 END) AS [IsInSSPEntitySchemaAccessList]
в PostgreSql следует использовать конструкцию
EXISTS ( SELECT 1 FROM "SysSSPEntitySchemaAccessList" WHERE "EntitySchemaUId" = BaseSchema."UId" ) "IsInSSPEntitySchemaAccessList"
Полученное в результате запроса поле будет иметь тип BOOL.
Соответствие типов данных
Табл. 1. — Таблица соответствия типов данных Creatio, MS SQL и PostgreSQL
Тип данных в дизайнере объекта Creatio | Тип данных в MS SQL | Тип данных в PostgreSQL |
---|---|---|
BLOB | VARBINARY | BYTEA |
Boolean | BIT | BOOLEAN |
Color | NVARCHAR | CHARACTER VARYING |
CRC | NVARCHAR | CHARACTER VARYING |
Currency | DECIMAL | NUMERIC |
Date | DATE | DATE |
Date/Time | DATETIME2 | TIMESTAMP WITHOUT TIME ZONE |
Decimal (0.00000001) | DECIMAL | NUMERIC |
Decimal (0.0001) | DECIMAL | NUMERIC |
Decimal (0.001) | DECIMAL | NUMERIC |
Decimal (0.01) | DECIMAL | NUMERIC |
Decimal (0.1) | DECIMAL | NUMERIC |
Encrypted string | NVARCHAR | CHARACTER VARYING |
File | VARBINARY | BYTEA |
Image | VARBINARY | BYTEA |
Image Link | UNIQUEIDENTIFIER | UUID |
Integer | INTEGER | INTEGER |
Lookup | UNIQUEIDENTIFIER | UUID |
Text (250 characters) | NVARCHAR(250) | CHARACTER VARYING |
Text (50 characters) | NVARCHAR(50) | CHARACTER VARYING |
Text (500 characters) | NVARCHAR(500) | CHARACTER VARYING |
Time | TIME | TIME WITHOUT TIME ZONE |
Unique identifier | UNIQUEIDENTIFIER | UUID |
Unlimited length text | NVARCHAR(MAX) | TEXT |
Привязка SQL-сценария к пакету
Если в пакете привязаны SQL-сценарии, например, для MS SQL, то для работы с Postgres создайте скрипт, который выполняет те же функции, но использует синтаксис PostgreSQL. Для этого на вкладке [SQL-сценарии] добавьте скрипт с типом СУБД PostgreSql (рис. 1).
Рис. 1. — Привязка SQL-сценария PostgreSQL к пакету
Примеры сравнительных скриптов для MS SQL и PostgreSQL
Для просмотра примеров скачайте файлы по ссылкам ниже.
Представления
- Пример SQL-скрипта, создающего представление и тригеры для добавления, изменения и удаления записей из целевой таблицы.
- Пример SQL-скрипта, иллюстрирующего использование правила вместо триггера в PostgreSQL.
Хранимые процедуры и функции
- Пример SQL-скрипта, создающего хранимую процедуру, использующую циклы, курсоры и временные таблицы.
- Пример рекурсивной хранимой процедуры, которая возвращает таблицу и в которой используется PERFORM.
- Пример хранимой процедуры, в которой используется обработка исключений и выполнение кастомного скрипта.
- Пример функции.
Документация по разработке скриптов PostgreSql:
- Официальная документация вендора СУБД.
- Курс от Postgres Pro “Разработка серверной части приложений PostgreSQL 9.6. Базовый курс”.