Saltar al contenido
Inicio de IntoSQL

Convierte SQL Server a PostgreSQL

Suelta el script que escribe Generate Scripts de SSMS con esquema y datos, en .sql o .sql.gz, UTF-16 o UTF-8, y descarga un script de PostgreSQL con las mismas tablas, claves, índices y datos. Cada valor que PostgreSQL no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.

Tu archivo
sqlshop_2024_sqlserver.sqlArchivo de ejemplo, 11 kB
Tu base de datos

18 filas convertidas, 3 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_sqlserver.sqlVolcado de SQL Server · escrito por SQL Server Management Objects · utf-8

  • orders10 filas2
    11 columnas
    idinteger not null
    customer_idinteger not null
    statusvarchar(10) not null
    totalnumeric(19,4) not null
    itemssmallint not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(6)
    notetext
    detailstext
    order_refuuid not null
    total_with_taxnumeric(12,2)
  • customers8 filas1
    8 columnas
    idinteger not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countryvarchar(2) not null
    is_activeboolean not null
    signed_update
    created_attimestamptz(0) not null
    row_versionbytea

Sin convertir

  • Vista paid_orders
  • Disparador orders_no_negative

Cada base de datos los escribe en su propio lenguaje. Reescríbelos para 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';

Correcciones

  1. "items" de orders no tiene signo, así que se volvió smallint con un CHECK de que no sea negativa.
  2. "shipped_at" de orders es datetime2(7), con más dígitos de segundo de los que guarda PostgreSQL, así que es timestamp(6) y se cortan los últimos dígitos.
  3. "row_version" de customers es una versión de fila que SQL Server asigna por sí mismo; el volcado no tiene valores para ella, así que es bytea y queda vacía.

Para revisar

  • 6 columnas de texto comparan sin distinguir mayúsculas en el origen; PostgreSQL compara exactamente, así que las claves únicas y las búsquedas pueden comportarse distinto. Usa una intercalación o un tipo de columna que no distinga mayúsculas en las columnas que lo necesiten.
  • 2 vistas, disparadores, rutinas o eventos no se convierten; el informe lista cada uno. Vuelve a crearlos a mano en PostgreSQL.
  • El CHECK check1 de orders no se puede escribir para PostgreSQL (function isjson), así que no se crea. Escribe el CHECK a mano si es importante.
  • El índice idx_orders_pending de orders usa una expresión que no se puede escribir para PostgreSQL (filtered index), así que no se crea. Crea el índice a mano si las consultas lo necesitan.

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

Qué cambia de SQL Server a PostgreSQL

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

  • bit

    boolean

    bit guarda 1 y 0, que son el true y el false de PostgreSQL.

  • tinyint

    smallint con un CHECK de que no sea negativo

    El tinyint de SQL Server va de 0 a 255; el entero más pequeño de PostgreSQL tiene signo, así que un CHECK conserva su rango.

    Línea del informe: unsigned_widened

  • char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text

    varchar(n) y text

    El text de PostgreSQL admite cualquier carácter, así que varchar y nvarchar son el mismo tipo.

  • decimal(p,s), money, smallmoney

    numeric(p,s); money como numeric(19,4)

    Se conserva cada dígito, y money con sus cuatro decimales.

  • datetime, datetime2, smalldatetime

    timestamp(p)

    Un datetime es una lectura de reloj, como un timestamp sin zona horaria.

  • datetime2(7), time(7) and datetimeoffset(7)

    seis dígitos de segundo, el séptimo se corta

    PostgreSQL guarda microsegundos; el séptimo dígito (100 nanosegundos) se corta, nunca se redondea, así que ningún valor pasa al segundo o al día siguiente.

    Línea del informe: fraction_cut

  • datetimeoffset

    timestamptz, los mismos instantes

    timestamptz conserva el instante; PostgreSQL lo muestra en la zona horaria de la sesión en lugar del desfase que tenía cada valor.

  • time

    time(p)

    Las mismas horas del día.

  • json (SQL Server 2025)

    jsonb

    Los mismos valores JSON.

  • uniqueidentifier

    uuid

    Los mismos identificadores, escritos en minúsculas.

  • binary, varbinary, image

    bytea

    Los bytes siguen siendo bytes.

  • geometry, geography

    bytea con los bytes propios de SQL Server

    SSMS escribe los valores espaciales en la serialización de SQL Server, que se conserva byte a byte.

    Línea del informe: spatial_as_native

  • rowversion, timestamp

    bytea, sin valores

    SQL Server asigna la versión de fila por sí mismo y SSMS no escribe valores para ella en el script.

    Línea del informe: rowversion_empty

  • sql_variant, hierarchyid, vector

    text

    PostgreSQL no tiene un tipo equivalente; sql_variant conserva el texto de cada valor y hierarchyid su ruta, como /1/2/. xml sigue siendo xml.

    Línea del informe: type_replaced

  • collations that ignore case (_CI_)

    comparación exacta

    PostgreSQL compara el texto exactamente, así que las columnas que no distinguían mayúsculas en SQL Server ahora distinguen Ana de ana.

    Línea del informe: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT AS IDENTITY, siguiendo después del id más alto

    Los ids copiados se cargan tal cual, y el contador sigue después del más alto.

  • CREATE SEQUENCE

    CREATE SEQUENCE con las mismas opciones

    Las secuencias de PostgreSQL funcionan de la misma forma. SSMS no escribe hasta dónde llegó una secuencia, así que empieza donde se creó.

  • computed columns

    columnas generadas, STORED

    PostgreSQL 13 a 17 solo guardan columnas generadas; la fórmula es la misma, con CONCAT escrito para que NULL cuente como vacío, como en SQL Server.

    Línea del informe: virtual_as_stored

  • computed columns with functions PostgreSQL lacks

    una columna simple

    Una fórmula que no se puede escribir para PostgreSQL deja una columna simple y una línea en el informe; SSMS no escribe valores para las columnas calculadas.

    Línea del informe: generated_not_translated

  • defaults with functions PostgreSQL lacks, and NEXT VALUE FOR

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir para PostgreSQL se deja fuera y aparece en el informe.

    Línea del informe: default_not_translated

  • CHECK constraints

    traducidos

    Los mismos CHECK, comprobados al cargar cada fila.

  • CHECK constraints with functions PostgreSQL lacks

    no se crea

    Un CHECK que no se puede escribir para PostgreSQL se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    no se crea

    SQL Server no aplica estos CHECK, así que las filas pueden no cumplirlos.

    Línea del informe: check_not_enforced

  • filtered and columnstore indexes

    no se crea

    IntoSQL escribe índices b-tree sobre columnas; vuelve a crear los demás después de cargar.

    Línea del informe: index_skipped

  • foreign keys

    claves foráneas, después de las filas

    Las filas cargan en cualquier orden, y después las claves las comprueban.

  • foreign keys to tables the dump doesn't create

    no se crea

    Una clave no puede nombrar una tabla que no existe.

    Línea del informe: foreign_key_skipped

  • tables on a partition scheme

    una tabla con las filas de todas las particiones

    Las filas son las mismas; vuelve a particionar la tabla en PostgreSQL si lo necesita.

    Línea del informe: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    dos tablas: las filas actuales y el historial

    La tabla y su tabla de historial se copian como tablas simples; PostgreSQL no conserva el historial por sí mismo.

    Línea del informe: system_versioning_dropped

  • NOT NULL columns with values that become NULL

    sin NOT NULL

    Una columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.

    Línea del informe: not_null_relaxed

  • views, functions, procedures, triggers, synonyms, types and partition functions

    listados en el informe

    Su código está escrito en T-SQL, así que se listan para que los vuelvas a crear.

    Línea del informe: not_converted_objects

  • scripts without CREATE TABLE (data only)

    tipos leídos de los valores

    Un script solo de datos solo tiene filas, así que los tipos salen de los valores.

    Línea del informe: no_schema

  • expressions in INSERT values

    NULL

    Un convertidor que no ejecuta una base de datos no puede evaluarlas.

    Línea del informe: expression_value

  • types IntoSQL doesn't know

    text

    El texto admite cualquier valor; cambia el tipo después de cargar.

    Línea del informe: unknown_type

  • dates that aren't valid

    NULL

    Un valor que no es una fecha se vuelve NULL y el informe lo cuenta.

    Línea del informe: date_out_of_range

  • NUL characters in text

    se quita

    El texto de PostgreSQL no puede contener un carácter NUL. Se quita y el informe cuenta los valores.

    Línea del informe: nul_removed

  • text that isn't valid in its encoding

    los bytes incorrectos como carácter de reemplazo

    El texto de PostgreSQL debe ser UTF-8 válido.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El script contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

En SQL ServerEn PostgreSQLLínea del informe
bitbooleanbit guarda 1 y 0, que son el true y el false de PostgreSQL.
tinyintsmallint con un CHECK de que no sea negativoEl tinyint de SQL Server va de 0 a 255; el entero más pequeño de PostgreSQL tiene signo, así que un CHECK conserva su rango.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textvarchar(n) y textEl text de PostgreSQL admite cualquier carácter, así que varchar y nvarchar son el mismo tipo.
decimal(p,s), money, smallmoneynumeric(p,s); money como numeric(19,4)Se conserva cada dígito, y money con sus cuatro decimales.
datetime, datetime2, smalldatetimetimestamp(p)Un datetime es una lectura de reloj, como un timestamp sin zona horaria.
datetime2(7), time(7) and datetimeoffset(7)seis dígitos de segundo, el séptimo se cortaPostgreSQL guarda microsegundos; el séptimo dígito (100 nanosegundos) se corta, nunca se redondea, así que ningún valor pasa al segundo o al día siguiente.fraction_cut
datetimeoffsettimestamptz, los mismos instantestimestamptz conserva el instante; PostgreSQL lo muestra en la zona horaria de la sesión en lugar del desfase que tenía cada valor.
timetime(p)Las mismas horas del día.
json (SQL Server 2025)jsonbLos mismos valores JSON.
uniqueidentifieruuidLos mismos identificadores, escritos en minúsculas.
binary, varbinary, imagebyteaLos bytes siguen siendo bytes.
geometry, geographybytea con los bytes propios de SQL ServerSSMS escribe los valores espaciales en la serialización de SQL Server, que se conserva byte a byte.spatial_as_native
rowversion, timestampbytea, sin valoresSQL Server asigna la versión de fila por sí mismo y SSMS no escribe valores para ella en el script.rowversion_empty
sql_variant, hierarchyid, vectortextPostgreSQL no tiene un tipo equivalente; sql_variant conserva el texto de cada valor y hierarchyid su ruta, como /1/2/. xml sigue siendo xml.type_replaced
collations that ignore case (_CI_)comparación exactaPostgreSQL compara el texto exactamente, así que las columnas que no distinguían mayúsculas en SQL Server ahora distinguen Ana de ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT AS IDENTITY, siguiendo después del id más altoLos ids copiados se cargan tal cual, y el contador sigue después del más alto.
CREATE SEQUENCECREATE SEQUENCE con las mismas opcionesLas secuencias de PostgreSQL funcionan de la misma forma. SSMS no escribe hasta dónde llegó una secuencia, así que empieza donde se creó.
computed columnscolumnas generadas, STOREDPostgreSQL 13 a 17 solo guardan columnas generadas; la fórmula es la misma, con CONCAT escrito para que NULL cuente como vacío, como en SQL Server.virtual_as_stored
computed columns with functions PostgreSQL lacksuna columna simpleUna fórmula que no se puede escribir para PostgreSQL deja una columna simple y una línea en el informe; SSMS no escribe valores para las columnas calculadas.generated_not_translated
defaults with functions PostgreSQL lacks, and NEXT VALUE FORsin valor predeterminadoUn valor predeterminado que no se puede escribir para PostgreSQL se deja fuera y aparece en el informe.default_not_translated
CHECK constraintstraducidosLos mismos CHECK, comprobados al cargar cada fila.
CHECK constraints with functions PostgreSQL lacksno se creaUn CHECK que no se puede escribir para PostgreSQL se deja fuera y aparece en el informe.check_skipped
CHECK constraints added WITH NOCHECK or disabledno se creaSQL Server no aplica estos CHECK, así que las filas pueden no cumplirlos.check_not_enforced
filtered and columnstore indexesno se creaIntoSQL escribe índices b-tree sobre columnas; vuelve a crear los demás después de cargar.index_skipped
foreign keysclaves foráneas, después de las filasLas filas cargan en cualquier orden, y después las claves las comprueban.
foreign keys to tables the dump doesn't createno se creaUna clave no puede nombrar una tabla que no existe.foreign_key_skipped
tables on a partition schemeuna tabla con las filas de todas las particionesLas filas son las mismas; vuelve a particionar la tabla en PostgreSQL si lo necesita.partitions_dropped
temporal tables (SYSTEM_VERSIONING)dos tablas: las filas actuales y el historialLa tabla y su tabla de historial se copian como tablas simples; PostgreSQL no conserva el historial por sí mismo.system_versioning_dropped
NOT NULL columns with values that become NULLsin NOT NULLUna columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionslistados en el informeSu código está escrito en T-SQL, así que se listan para que los vuelvas a crear.not_converted_objects
scripts without CREATE TABLE (data only)tipos leídos de los valoresUn script solo de datos solo tiene filas, así que los tipos salen de los valores.no_schema
expressions in INSERT valuesNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas.expression_value
types IntoSQL doesn't knowtextEl texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
dates that aren't validNULLUn valor que no es una fecha se vuelve NULL y el informe lo cuenta.date_out_of_range
NUL characters in textse quitaEl texto de PostgreSQL no puede contener un carácter NUL. Se quita y el informe cuenta los valores.nul_removed
text that isn't valid in its encodinglos bytes incorrectos como carácter de reemplazoEl texto de PostgreSQL debe ser UTF-8 válido.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl script contiene exactamente estos caracteres, así que se copian; el informe los señala.mojibake_suspected

Carga el script en PostgreSQL

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sql

Las claves foráneas se agregan como NOT VALID y luego se validan. Si una fila apunta a una fila que no existe, el script te dice qué restricción es, en lugar de fallar a medias.

Para un volcado grande, crea primero la base de datos y ejecuta el script con psql desde la misma máquina que el servidor.

IntoSQL Pro carga el archivo directo en PostgreSQL desde la app de escritorio o la línea de comandos, sin escribir un script.

Haz el volcado de SQL Server para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

  • En SSMS, haz clic derecho en la base de datos, Tasks, Generate Scripts, y elige las tablas. dbatools, mssql-scripter y otras herramientas basadas en la misma biblioteca escriben el mismo script.
  • En Advanced, cambia Types of data to script a Schema and data. Un script solo del esquema tiene tablas sin filas.
  • Guárdalo como Unicode, el formato predeterminado de SSMS, o como UTF-8: ambos se leen igual, y gzip también funciona.

Qué no se convierte

Las vistas, funciones, procedimientos, disparadores, sinónimos, reglas y políticas de seguridad se escriben en T-SQL. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para PostgreSQL.

Preguntas sobre SQL Server a PostgreSQL

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

¿Lee el archivo UTF-16 que guarda SSMS?

Sí. SSMS guarda los scripts en UTF-16 por defecto, y el convertidor lee UTF-16 y UTF-8 por igual, con gzip o sin él, con GO entre lotes.

¿De qué versiones de SQL Server puede venir el script?

Scripts que SSMS, dbatools o mssql-scripter escriben desde SQL Server 2017 en adelante. Cada script de prueba viene de SQL Server 2017, 2022 y 2025 y se compara con su origen celda por celda.

¿Se conservan los valores IDENTITY?

Sí. Las columnas IDENTITY se vuelven columnas de identidad, cada fila conserva su id y el siguiente id sigue después del más alto. Las secuencias se crean con las mismas opciones.

¿Qué pasa con money, datetimeoffset y otros tipos de SQL Server?

bit se vuelve boolean, money numeric(19,4), uniqueidentifier uuid, xml xml y datetimeoffset timestamptz. datetime2 conserva seis dígitos de segundo y el séptimo se corta. Las columnas que no distinguían mayúsculas se comparan exactamente, y el informe dice cuáles.

¿Qué pasa con los procedimientos, los disparadores y las vistas?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.

¿En qué versiones de PostgreSQL carga el script?

PostgreSQL 13 a 18. El mismo script carga en cada una, y se detiene en el primer error si algo sale mal.