Конвертация SQL Server в PostgreSQL
Перетащите скрипт, который Generate Scripts в SSMS записывает со схемой и данными, в формате .sql или .sql.gz, в UTF-16 или UTF-8, и скачайте скрипт PostgreSQL с теми же таблицами, ключами, индексами и данными. Каждое значение, которое PostgreSQL не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.
18 строк конвертировано, 3 исправления, ни одна не отклонена
Таблицы в shop_2024_sqlserver.sqlДамп SQL Server · создан программой SQL Server Management Objects · utf-8
orders10 строк2
11 столбцов id integer not null customer_id integer not null status varchar(10) not null total numeric(19,4) not null items smallint not null ordered_at timestamp(0) not null shipped_at timestamp(6) note text details text order_ref uuid not null total_with_tax numeric(12,2) customers8 строк1
8 столбцов id integer not null name varchar(100) not null email varchar(200) not null country varchar(2) not null is_active boolean not null signed_up date created_at timestamptz(0) not null row_version bytea
Не конвертировано
- Представление paid_orders
- Триггер orders_no_negative
Каждая база данных пишет их на своем языке. Перепишите их для PostgreSQL.
-- Written by IntoSQL from a SQL Server dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';
CREATE TABLE orders (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
customer_id integer NOT NULL,
status varchar(10) DEFAULT 'pending' NOT NULL,
total numeric(19,4) NOT NULL,
items smallint DEFAULT 1 NOT NULL,
ordered_at timestamp(0) NOT NULL,
shipped_at timestamp(6),
note text,
details text,
order_ref uuid DEFAULT (gen_random_uuid()::text) NOT NULL,
total_with_tax numeric(12,2) GENERATED ALWAYS AS ((cast(total * (1.16) AS numeric(12,2)))::numeric(12,2)) STORED,
CONSTRAINT orders_items_check CHECK (items >= 0),
CONSTRAINT orders_check2 CHECK (status = 'cancelled' OR status = 'shipped' OR status = 'paid' OR status = 'pending'),
CONSTRAINT orders_check3 CHECK (total >= (0))
);
CREATE TABLE customers (
id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name varchar(100) NOT NULL,
email varchar(200) NOT NULL,
country varchar(2) DEFAULT 'US' NOT NULL,
is_active boolean DEFAULT true NOT NULL,
signed_up date,
created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
row_version bytea
);
COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1 Ana Martínez ana@example.com MX t 2023-01-15 2023-01-15 10:24:00.000000+00:00
2 Zoë Müller zoe@example.de DE t 2023-02-03 2023-02-03 08:11:42.000000+00:00
3 José Peña jose@example.es ES f 2023-03-21 2023-03-21 19:05:17.000000+00:00
4 李雷 lilei@example.cn CN t 2023-05-09 2023-05-09 02:40:00.000000+00:00
5 Noah O'Brien noah@example.ie IE t \N 2023-06-30 14:00:00.000000+00:00
6 Amélie Laurent amelie@example.fr FR t 2024-01-02 2024-01-02 09:30:00.000000+00:00
7 Ravi Patel ravi@example.in IN f 2024-02-29 2024-02-29 23:59:59.000000+00:00
8 Sofia Rossi 🌻 sofia@example.it IT t 2024-04-12 2024-04-12 12:12:12.000000+00:00
\.
COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) FROM stdin;
1 1 shipped 129.9000 3 2024-03-01T10:00:00.000000 2024-03-02T16:30:00.123456 \N {"gift": false} 0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f
2 2 paid 54.0000 1 2024-03-02T11:15:00.000000 \N Gift wrap 🎁 {"gift": true, "wrap": "red"} 1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70
3 1 cancelled 12.5000 1 2024-03-03T09:45:00.000000 \N Customer changed their mind \N 2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081
4 4 shipped 980.0000 12 2024-03-05T02:10:00.000000 2024-03-07T08:00:00.000000 请小心轻放 {"fragile": true} 3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192
5 5 pending 45.7500 2 2024-03-08T17:20:00.000000 \N Leave at the door; ring twice \N 4f1e806c-7d5b-4c2e-9a99-5e6f708192a3
6 6 shipped 310.4000 5 2024-03-10T13:00:00.000000 2024-03-11T09:00:00.000000 Fragile: "glass" {"fragile": true} 50f2917d-8e6c-4d3f-8baa-6f708192a3b4
7 8 paid 76.2000 2 2024-03-11T18:45:00.000000 \N \N \N 6103a28e-9f7d-4e40-9cbb-708192a3b4c5
8 2 shipped 19.9900 1 2024-03-12T08:00:00.000000 9999-12-31T23:59:59.999999 Shipped date set to the maximum by an old import \N 7214b39f-a08e-4f51-8dcc-8192a3b4c5d6
9 3 shipped 64.0000 2 2024-03-14T15:30:00.000000 2024-03-15T10:00:00.000000 Two parcels {"parcels": [1, 2]} 8325c4a0-b19f-4062-9edd-92a3b4c5d6e7
10 7 paid 1499.0000 1 2024-03-15T21:05:00.000000 \N C:\\Users\\ravi\\invoice.pdf \N 9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8
\.
-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX customers_email ON customers (email);
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_email UNIQUE USING INDEX customers_email;
ALTER TABLE orders ADD CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
ALTER TABLE orders VALIDATE CONSTRAINT orders_fkey;
EXCEPTION WHEN foreign_key_violation THEN
RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
Исправления
- Столбец "items" таблицы orders беззнаковый, поэтому он стал smallint с проверкой, что значение не отрицательное.
- "shipped_at" таблицы orders имеет тип datetime2(7), в нем больше цифр долей секунды, чем хранит PostgreSQL, поэтому это timestamp(6), а последние цифры отбрасываются.
- "row_version" таблицы customers - это версия строки, которую SQL Server задает сам; в дампе нет ее значений, поэтому это bytea, и столбец пуст.
Требует проверки
- 6 текстовых столбцов сравнивают значения без учета регистра в источнике; PostgreSQL сравнивает точно, поэтому уникальные ключи и поиск могут работать иначе. Используйте сопоставление или тип столбца без учета регистра для столбцов, которым это нужно.
- Не конвертированы представления, триггеры, процедуры и события (2 объекта); отчет перечисляет каждый. Создайте их заново вручную в PostgreSQL.
- Проверку check1 таблицы orders нельзя записать для PostgreSQL (function isjson), поэтому она не создана. Запишите проверку вручную, если она важна.
- Индекс idx_orders_pending таблицы orders использует выражение, которое нельзя записать для PostgreSQL (filtered index), поэтому он не создан. Создайте индекс вручную, если он нужен запросам.
Файл конвертируется на этом компьютере и никуда не загружается.
Другие примеры:
Что меняется при переходе с SQL Server на PostgreSQL
Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.
bit
boolean
bit хранит 1 и 0, то есть true и false в PostgreSQL.
tinyint
smallint с CHECK, что значение не отрицательное
tinyint в SQL Server принимает значения от 0 до 255; наименьшее целое в PostgreSQL знаковое, поэтому проверка сохраняет диапазон.
Строка отчета: unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text
varchar(n) и text
text в PostgreSQL вмещает любой символ, поэтому varchar и nvarchar становятся одним типом.
decimal(p,s), money, smallmoney
numeric(p,s); money как numeric(19,4)
Сохраняется каждая цифра, money - со своими четырьмя знаками после запятой.
datetime, datetime2, smalldatetime
timestamp(p)
datetime - это показание часов, как timestamp without time zone.
datetime2(7), time(7) and datetimeoffset(7)
шесть цифр долей секунды, седьмая отбрасывается
PostgreSQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день.
Строка отчета: fraction_cut
datetimeoffset
timestamptz, те же моменты
timestamptz сохраняет момент; PostgreSQL показывает его в часовом поясе сеанса, а не со смещением, которое было у значения.
time
time(p)
То же время суток.
json (SQL Server 2025)
jsonb
Те же значения JSON.
uniqueidentifier
uuid
Те же идентификаторы, записанные строчными буквами.
binary, varbinary, image
bytea
Байты остаются байтами.
geometry, geography
bytea с собственными байтами SQL Server
SSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт.
Строка отчета: spatial_as_native
rowversion, timestamp
bytea, пустой
SQL Server сам задает версию строки, и SSMS не записывает для нее значений.
Строка отчета: rowversion_empty
sql_variant, hierarchyid, vector
text
В PostgreSQL нет равнозначного типа; sql_variant сохраняет текст каждого значения, а hierarchyid - свой путь, например /1/2/. xml остается xml.
Строка отчета: type_replaced
collations that ignore case (_CI_)
точное сравнение
PostgreSQL сравнивает текст точно, поэтому столбцы, которые в SQL Server не учитывали регистр, теперь различают Ana и ana.
Строка отчета: case_insensitive_collation
IDENTITY
GENERATED BY DEFAULT AS IDENTITY, продолжается после наибольшего id
Скопированные id загружаются как есть, а счетчик продолжается после наибольшего.
CREATE SEQUENCE
CREATE SEQUENCE с теми же параметрами
Последовательности в PostgreSQL работают так же. SSMS не записывает, до какого значения дошла последовательность, поэтому она начинается с того, с чего была создана.
computed columns
генерируемые столбцы, STORED
PostgreSQL с 13 по 17 только хранит генерируемые столбцы; формула та же, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server.
Строка отчета: virtual_as_stored
computed columns with functions PostgreSQL lacks
обычный столбец
Формула, которую нельзя записать для PostgreSQL, оставляет обычный столбец и строку в отчете; SSMS не записывает значения вычисляемых столбцов.
Строка отчета: generated_not_translated
defaults with functions PostgreSQL lacks, and NEXT VALUE FOR
без значения по умолчанию
Значение по умолчанию, которое нельзя записать для PostgreSQL, опускается и попадает в отчет.
Строка отчета: default_not_translated
CHECK constraints
переводится
Те же проверки, применяемые при загрузке каждой строки.
CHECK constraints with functions PostgreSQL lacks
не создается
Проверка, которую нельзя записать для PostgreSQL, опускается и попадает в отчет.
Строка отчета: check_skipped
CHECK constraints added WITH NOCHECK or disabled
не создается
SQL Server не применяет эти проверки, поэтому строки могут их нарушать.
Строка отчета: check_not_enforced
filtered and columnstore indexes
не создается
IntoSQL пишет индексы b-tree по столбцам; остальные создайте заново после загрузки.
Строка отчета: index_skipped
foreign keys
внешние ключи, после строк
Строки загружаются в любом порядке, а ключи проверяют их после этого.
foreign keys to tables the dump doesn't create
не создается
Ключ не может ссылаться на таблицу, которой нет.
Строка отчета: foreign_key_skipped
tables on a partition scheme
одна таблица со строками всех секций
Строки те же; при необходимости секционируйте таблицу заново в PostgreSQL.
Строка отчета: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
две таблицы: текущие строки и история
Таблица и ее таблица истории копируются как обычные таблицы; PostgreSQL не ведет историю сам.
Строка отчета: system_versioning_dropped
NOT NULL columns with values that become NULL
NOT NULL снимается
Столбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.
Строка отчета: not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functions
перечисляются в отчете
Их код написан на T-SQL, поэтому они перечислены, чтобы вы создали их заново.
Строка отчета: not_converted_objects
scripts without CREATE TABLE (data only)
типы определяются по значениям
Скрипт только с данными содержит лишь строки, поэтому типы берутся из значений.
Строка отчета: no_schema
expressions in INSERT values
NULL
Конвертер, который не запускает базу данных, не может их вычислить.
Строка отчета: expression_value
types IntoSQL doesn't know
text
Тип text вмещает любое значение; измените тип после загрузки.
Строка отчета: unknown_type
dates that aren't valid
NULL
Значение, которое не является датой, становится NULL, и отчет его подсчитывает.
Строка отчета: date_out_of_range
NUL characters in text
удаляется
text в PostgreSQL не может содержать символ NUL. Он удаляется, и отчет подсчитывает такие значения.
Строка отчета: nul_removed
text that isn't valid in its encoding
неверные байты заменяются символом замены
Текст в PostgreSQL должен быть корректным UTF-8.
Строка отчета: invalid_utf8_replaced
text decoded twice (ñ)
копируется как есть
Скрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.
Строка отчета: mojibake_suspected
| В SQL Server | В PostgreSQL | Строка отчета |
|---|---|---|
| bit | booleanbit хранит 1 и 0, то есть true и false в PostgreSQL. | |
| tinyint | smallint с CHECK, что значение не отрицательноеtinyint в SQL Server принимает значения от 0 до 255; наименьшее целое в PostgreSQL знаковое, поэтому проверка сохраняет диапазон. | unsigned_widened |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | varchar(n) и texttext в PostgreSQL вмещает любой символ, поэтому varchar и nvarchar становятся одним типом. | |
| decimal(p,s), money, smallmoney | numeric(p,s); money как numeric(19,4)Сохраняется каждая цифра, money - со своими четырьмя знаками после запятой. | |
| datetime, datetime2, smalldatetime | timestamp(p)datetime - это показание часов, как timestamp without time zone. | |
| datetime2(7), time(7) and datetimeoffset(7) | шесть цифр долей секунды, седьмая отбрасываетсяPostgreSQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день. | fraction_cut |
| datetimeoffset | timestamptz, те же моментыtimestamptz сохраняет момент; PostgreSQL показывает его в часовом поясе сеанса, а не со смещением, которое было у значения. | |
| time | time(p)То же время суток. | |
| json (SQL Server 2025) | jsonbТе же значения JSON. | |
| uniqueidentifier | uuidТе же идентификаторы, записанные строчными буквами. | |
| binary, varbinary, image | byteaБайты остаются байтами. | |
| geometry, geography | bytea с собственными байтами SQL ServerSSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт. | spatial_as_native |
| rowversion, timestamp | bytea, пустойSQL Server сам задает версию строки, и SSMS не записывает для нее значений. | rowversion_empty |
| sql_variant, hierarchyid, vector | textВ PostgreSQL нет равнозначного типа; sql_variant сохраняет текст каждого значения, а hierarchyid - свой путь, например /1/2/. xml остается xml. | type_replaced |
| collations that ignore case (_CI_) | точное сравнениеPostgreSQL сравнивает текст точно, поэтому столбцы, которые в SQL Server не учитывали регистр, теперь различают Ana и ana. | case_insensitive_collation |
| IDENTITY | GENERATED BY DEFAULT AS IDENTITY, продолжается после наибольшего idСкопированные id загружаются как есть, а счетчик продолжается после наибольшего. | |
| CREATE SEQUENCE | CREATE SEQUENCE с теми же параметрамиПоследовательности в PostgreSQL работают так же. SSMS не записывает, до какого значения дошла последовательность, поэтому она начинается с того, с чего была создана. | |
| computed columns | генерируемые столбцы, STOREDPostgreSQL с 13 по 17 только хранит генерируемые столбцы; формула та же, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server. | virtual_as_stored |
| computed columns with functions PostgreSQL lacks | обычный столбецФормула, которую нельзя записать для PostgreSQL, оставляет обычный столбец и строку в отчете; SSMS не записывает значения вычисляемых столбцов. | generated_not_translated |
| defaults with functions PostgreSQL lacks, and NEXT VALUE FOR | без значения по умолчаниюЗначение по умолчанию, которое нельзя записать для PostgreSQL, опускается и попадает в отчет. | default_not_translated |
| CHECK constraints | переводитсяТе же проверки, применяемые при загрузке каждой строки. | |
| CHECK constraints with functions PostgreSQL lacks | не создаетсяПроверка, которую нельзя записать для PostgreSQL, опускается и попадает в отчет. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | не создаетсяSQL Server не применяет эти проверки, поэтому строки могут их нарушать. | check_not_enforced |
| filtered and columnstore indexes | не создаетсяIntoSQL пишет индексы b-tree по столбцам; остальные создайте заново после загрузки. | index_skipped |
| foreign keys | внешние ключи, после строкСтроки загружаются в любом порядке, а ключи проверяют их после этого. | |
| foreign keys to tables the dump doesn't create | не создаетсяКлюч не может ссылаться на таблицу, которой нет. | foreign_key_skipped |
| tables on a partition scheme | одна таблица со строками всех секцийСтроки те же; при необходимости секционируйте таблицу заново в PostgreSQL. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | две таблицы: текущие строки и историяТаблица и ее таблица истории копируются как обычные таблицы; PostgreSQL не ведет историю сам. | system_versioning_dropped |
| NOT NULL columns with values that become NULL | NOT NULL снимаетсяСтолбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится. | not_null_relaxed |
| views, functions, procedures, triggers, synonyms, types and partition functions | перечисляются в отчетеИх код написан на T-SQL, поэтому они перечислены, чтобы вы создали их заново. | not_converted_objects |
| scripts without CREATE TABLE (data only) | типы определяются по значениямСкрипт только с данными содержит лишь строки, поэтому типы берутся из значений. | no_schema |
| expressions in INSERT values | NULLКонвертер, который не запускает базу данных, не может их вычислить. | expression_value |
| types IntoSQL doesn't know | textТип text вмещает любое значение; измените тип после загрузки. | unknown_type |
| dates that aren't valid | NULLЗначение, которое не является датой, становится NULL, и отчет его подсчитывает. | date_out_of_range |
| NUL characters in text | удаляетсяtext в PostgreSQL не может содержать символ NUL. Он удаляется, и отчет подсчитывает такие значения. | nul_removed |
| text that isn't valid in its encoding | неверные байты заменяются символом заменыТекст в PostgreSQL должен быть корректным UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | копируется как естьСкрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает. | mojibake_suspected |
Загрузите скрипт в PostgreSQL
Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.
psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sqlВнешние ключи добавляются как NOT VALID, а затем проверяются. Если строка ссылается на несуществующую строку, скрипт сообщает, какое ограничение нарушено, а не прерывается на полпути.
Для большого дампа сначала создайте базу данных и запустите скрипт через psql на той же машине, где работает сервер.
IntoSQL Pro загружает файл прямо в PostgreSQL из приложения для компьютера или командной строки, без написания скрипта.
Как создать дамп SQL Server для лучшего результата
Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:
- В SSMS щелкните базу данных правой кнопкой, выберите Tasks, Generate Scripts и отметьте таблицы. dbatools, mssql-scripter и другие инструменты на той же библиотеке пишут такой же скрипт.
- В разделе Advanced задайте для Types of data to script значение Schema and data. Скрипт только со схемой содержит таблицы без строк.
- Сохраните его в Unicode, как по умолчанию в SSMS, или в UTF-8: оба читаются одинаково, gzip тоже подходит.
Что не конвертируется
Представления, функции, процедуры, триггеры, синонимы, правила и политики безопасности написаны на T-SQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для PostgreSQL.
Вопросы о SQL Server в PostgreSQL
Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов
Мой дамп загружается на сервер?
Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.
Насколько большим может быть дамп?
Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.
Читает ли он файл UTF-16, который сохраняет SSMS?
Да. SSMS по умолчанию сохраняет скрипты в UTF-16, а конвертер одинаково читает UTF-16 и UTF-8, сжатые gzip или нет, с GO между пакетами.
Из каких версий SQL Server может быть скрипт?
Скрипты, которые SSMS, dbatools или mssql-scripter пишут из SQL Server 2017 и новее. Каждый тестовый скрипт создан в SQL Server 2017, 2022 и 2025 и сверен с источником ячейка за ячейкой.
Сохраняются ли значения IDENTITY?
Да. Столбцы IDENTITY становятся столбцами identity, каждая строка сохраняет свой id, а следующий id идет после наибольшего. Последовательности создаются с теми же параметрами.
Что происходит с money, datetimeoffset и другими типами SQL Server?
bit становится boolean, money - numeric(19,4), uniqueidentifier - uuid, xml - xml, а datetimeoffset - timestamptz. datetime2 сохраняет шесть цифр долей секунды, седьмая отбрасывается. Столбцы, которые не учитывали регистр, сравниваются точно, и отчет указывает, какие именно.
А процедуры, триггеры и представления?
Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.
На каких версиях PostgreSQL загружается скрипт?
PostgreSQL с 13 по 18. Один и тот же скрипт загружается на каждой из них и останавливается на первой ошибке, если что-то пойдет не так.