Migrar usuarios de Oracle® a Cloud SQL para PostgreSQL: tipos de datos, usuarios y tablas

Este documento forma parte de una serie que proporciona información y directrices clave relacionadas con la planificación y la realización de migraciones de bases de datos Oracle® 11g/12c a la versión 12 de Cloud SQL para PostgreSQL. Además de la parte de configuración inicial, la serie incluye las siguientes partes:

Tipos de datos

Cloud SQL para PostgreSQL proporciona varios tipos de datos que son totalmente equivalentes o similares a los tipos de datos proporcionados por Oracle. En la siguiente tabla se indican los tipos de datos de PostgreSQL más habituales, seguidos de una comparación entre los tipos de datos primitivos de Oracle y los tipos de datos correspondientes de Cloud SQL para PostgreSQL. Cuando no se admite un tipo de datos, se indica un tipo de datos alternativo.

Tipos de datos primitivos de Cloud SQL para PostgreSQL 12

Familia de tipos de datos de Cloud SQL para PostgreSQL Nombre del tipo de datos de Cloud SQL para PostgreSQL Especificación del tipo de datos
Cadena o carácter CHAR(n) Almacena exactamente n caracteres. Alias de CHARACTER(n).
CHARACTER(n) Almacena exactamente n caracteres.
VARCHAR(n) Almacena un número variable de caracteres, hasta un máximo de n caracteres. Alias de CHARACTER VARYING(n).
CHARACTER VARYING(n) Almacena un número variable de caracteres, hasta un máximo de n caracteres.
TEXT Variante específica de VARCHAR que no requiere que especifiques un límite superior en el número de caracteres. La cadena de caracteres más larga que se puede almacenar es de 1 GB (lo mismo ocurre con todos los tipos de datos de caracteres de cadena).
Numérico SMALLINT El valor mínimo es -32768 y el máximo, 32767.
INTEGER El valor mínimo es -2147483648 y el máximo, 2147483647.
BIGINT El valor mínimo es -2^63 y el máximo es 2^63-1.
REAL Número de punto flotante de precisión simple (4 bytes).
DOUBLE PRECISION Número de punto flotante de doble precisión (8 bytes).
DECIMAL (p,s) Puede almacenar cualquier valor con p dígitos y s decimales.
NUMERIC(p,s) Puede almacenar cualquier valor con p dígitos y s decimales.
SMALLSERIAL Número entero de incremento automático. El valor mínimo es 1 y el máximo, 32.767.
SERIAL Número entero de incremento automático. El valor mínimo es 1 y el máximo, 2147483647.
BIGSERIAL Número entero de incremento automático. El valor mínimo es 1 y el máximo es 2^63-1.
Monetary MONEY Importe de moneda con una precisión fraccionaria fija. El valor mínimo es -92233720368547758,08 y el máximo es +92233720368547758,07.
Fecha y hora DATE - Valores con una parte de fecha, pero sin parte de hora.
- El intervalo admitido es del 4713 a. C. al 5874897 d. C., con una resolución de 1 día.
TIMESTAMP (p) - Valores que contienen tanto la fecha como la hora.
- El intervalo admitido es del 4713 a. C. al 294276 d. C.
- La resolución es de p dígitos fraccionarios en segundos (o 1 microsegundo si no se especifica).
TIMESTAMP (p) with time zone - Valores que contengan la fecha, la hora y la zona horaria.
- El intervalo admitido es del 4713 a. C. al 294276 d. C.
- La resolución es de p dígitos fraccionarios en segundos (o 1 microsegundo si no se especifica).
TIME (p) - Valores con una parte de hora, pero sin parte de fecha.
- El intervalo admitido es de 00:00:00 a 24:00:00.
- La resolución es de p dígitos fraccionarios en segundos (o 1 microsegundo si no se especifica).
TIME (p) with time zone - Valores con una hora y una zona horaria, pero sin parte de fecha.
- El intervalo admitido es de 00:00:00 a 24:00:00.
- La resolución es de p dígitos fraccionarios en segundos (o 1 microsegundo si no se especifica).
INTERVAL (p) - Intervalo de tiempo
- El intervalo admitido es de -178.000.000 a 178.000.000 años.
- La resolución es de p dígitos fraccionarios en segundos (o 1 microsegundo si no se especifica).
JSON JSON Datos JSON textuales.
JSONB Datos JSON binarios.
XML XML Datos XML.

Geométrico
GEOMETRY El tipo de columna que se debe especificar cuando se quieran usar los siguientes modelos de datos.
POINT Valor de (x,y).
LINE Una tupla (A, B, C) en la que Ax + By + C = 0, A y B no son 0.

O BIEN

Punto 1 y punto 2 en los siguientes formatos:

[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2

LSEG Un segmento de línea ((x1,y1),(x2,y2)).
BOX Caja rectangular ((x1,y1),(x2,y2)).
PATH Una secuencia de puntos ((x1,y1),...).
POLYGON Una secuencia de puntos, que es como un trazado cerrado.
CIRCLE (x,y),r) (punto central y radio)
Lógico BOOLEAN - Contiene un valor verdadero, falso o nulo.
- Acepta valores como yes, true, t, on y 1 como verdaderos.
Datos binarios o de bits BIT (n) Cadena de bits de longitud fija.
BYTEA Datos binarios o matriz de bytes.
Tipos de direcciones de red CIDER Redes IPv4 e IPv6.
INET Hosts y redes IPv4 e IPv6.
MACADDR Direcciones MAC.
MACADDR8 Direcciones MAC (formato EUI-64).
Otros PG_LSN Número de secuencia de registro de Cloud SQL para PostgreSQL.
TSQUERY Consulta de búsqueda de texto.
TSVECTOR Buscar texto en un documento.
TXID_SNAPSHOT Instantánea del ID de transacción a nivel de usuario.
UUID Identificador único universal.

Conversión de tipos de datos de Oracle a Cloud SQL para PostgreSQL

Familia de tipos de datos de Oracle Nombre del tipo de datos de Oracle Especificación del tipo de datos de Oracle Equivalente de Cloud SQL para PostgreSQL en Oracle Alternativa o equivalente de Cloud SQL para PostgreSQL
Cadena o carácter CHAR(n) Tamaño máximo de 2000 bytes. CHAR(n)
CHARACTER(n) Tamaño máximo de 2000 bytes. CHARACTER(n)
NCHAR(n) Tamaño máximo de 2000 bytes. No CHAR(n)
VARCHAR(n) Tamaño máximo de 2000 bytes. VARCHAR(n)
NCHAR VARYING(n) Cadena UTF-8 de longitud variable. Tamaño máximo
de 4000 bytes.
No CHARACTER VARYING(n)
VARCHAR2(n) 11g Tamaño máximo de 4000 bytes y tamaño máximo de 32 KB en PL/SQL. Sí* VARCHAR(n)
VARCHAR2(n)
12g
Tamaño máximo de 32.767 bytes MAX_STRING_SIZE= EXTENDED. Sí* VARCHAR(n)
NVARCHAR2(n) Tamaño máximo de 4000 bytes. No VARCHAR(n)
LONG Tamaño máximo de 2 GB. Sí* TEXT
RAW(n) Tamaño máximo de 2000 bytes. Sí* BYTEA
LONG RAW Tamaño máximo de 2 GB. Sí* BYTEA
Numérico NUMBER Número de punto flotante. Sí* NUMERIC(p,s)
NUMBER(*) Número de punto flotante. Sí* DOUBLE PRECISION
NUMERIC(p,s) La precisión puede oscilar entre 1 y 38. NUMERIC(p,s)
FLOAT(p,s) Número de punto flotante. Sí* DOUBLE PRECISION
DEC(p,s) Número de punto fijo. DEC(p,s)
DECIMAL(p,s) Número de punto fijo. DECIMAL(p,s)
INT Número entero de 38 dígitos. INT
INTEGER Número entero de 38 dígitos. INTEGER
SMALLINT Número entero de 38 dígitos. SMALLINT
REAL Número de punto flotante. Sí* DOUBLE PRECISION
DOUBLE PRECISION Número de punto flotante. DOUBLE PRECISION
Fecha y hora DATE Almacena datos de fecha y hora (año, mes, día, hora, minuto y segundo). Sí* TIMESTAMP(0)
TIMESTAMP(p) Fecha y hora con fracción. TIMESTAMP(p)
TIMESTAMP(p) WITH TIME ZONE Fecha y hora con fracción y zona horaria. TIMESTAMP (p) WITH TIME ZONE
INTERVAL YEAR(p) TO MONTH Intervalo de fechas. Sí* INTERVAL YEAR TO MONTH
INTERVAL DAY(p) TO SECOND(s) Intervalo de día y hora. Sí* INTERVAL DAY TO SECOND(s)
Lógico BOOLEAN Valores TRUE, FALSE y NULL. No se puede asignar a una columna de tabla de base de datos. BOOLEAN
XML XMLTYPE Datos XML. No XML
LOB BFILE Puntero a un archivo binario con un tamaño máximo de 4 GB. No VARCHAR(255)
CLOB Objeto grande de caracteres con un tamaño máximo de archivo de 4 GB. No TEXT
BLOB Objeto binario grande con un tamaño máximo de 4 GB. No BYTEA
NCLOB Cadena Unicode de longitud variable con un tamaño máximo de archivo de 4 GB. No TEXT
ROWID ROWID Dirección física de la fila. No CTID
UROWID(n) ID de fila universal de las direcciones de fila lógicas. No CTID
Espacial SDO_ GEOMETRY Descripción geométrica de un objeto espacial. Postgres tiene varios tipos de geometría, como point, line, path, polygon, circle, etc.
SDO_TOPO_ GEOMETRY Describe una geometría de topología. PostGIS, una extensión de Postgres muy utilizada, proporciona varios tipos de topología.
SDO_GEORASTER Una cuadrícula ráster o un objeto de imagen se almacenan en una sola fila. PostGIS, una extensión de Postgres muy utilizada, proporciona una herramienta para cargar archivos ráster en la base de datos.
Tipos de contenido multimedia ORDDicom Admite el almacenamiento y la gestión de archivos Digital Imaging and Communications in Medicine (DICOM). Sí, con una solución alternativa Postgres proporciona un tipo binario, bytea, para almacenar objetos grandes.
ORDDoc Admite el almacenamiento y la gestión de cualquier tipo de datos multimedia. Sí, con una solución alternativa Postgres proporciona un tipo binario, bytea, para almacenar objetos grandes.
ORDImage Admite el almacenamiento y la gestión de datos de imagen. Sí, con una solución alternativa Postgres proporciona un tipo binario, bytea, para almacenar objetos grandes.
ORDVideo Admite el almacenamiento y la gestión de datos de vídeo. Solución Postgres proporciona un tipo binario, bytea, para almacenar objetos grandes.

* El tipo de datos correspondiente en Cloud SQL para PostgreSQL es compatible en su mayoría con Oracle, pero tiene un nombre diferente.

Tipos definidos por el usuario

Oracle se refiere a los tipos definidos por el usuario (UDTs) como OBJECT TYPES, que se gestionan con PL/SQL. Los tipos definidos por el usuario permiten crear tipos de datos complejos específicos de la aplicación que se basan en la lista de tipos de datos de Oracle integrada y la amplían.

Tipos definidos por el usuario de Oracle Descripción general o implementación de Oracle Compatibilidad con Cloud SQL para PostgreSQL Solución correspondiente o alternativa de Cloud SQL para PostgreSQL
Tipo de datos abstracto (TDA) CREATE TYPE ADT_DEMO AS OBJECT (
ID NUMBER(6),
NAME VARCHAR2(20)
);
Parcialmente con una sintaxis diferente Los tipos compuestos de Cloud SQL para PostgreSQL se especifican mediante una lista de nombres de atributos y tipos de datos:

CREATE TYPE ADT_DEMO AS
(
ID NUMERIC(6),
NAME VARCHAR(20)
);

Tipo VARRAY CREATE TYPE VARRAY_DEMO AS VARRAY (5) OF VARCHAR2(25); No Como solución alternativa, Cloud SQL para PostgreSQL permite definir columnas como una matriz:

CREATE TABLE VARRAY_TABLE (
NAME VARCHAR(25)[]
);

Tipo de tabla anidada CREATE TYPE NTT_DEMO AS OBJECT (
ID NUMBER(6),
NAME VARCHAR2(20)
) ;
CREATE TYPE NTT_TABLE AS TABLE OF NTT_DEMO;
No Como solución alternativa, usa una combinación de tipos compuestos y una definición de columna de matriz en Cloud SQL para PostgreSQL para conseguir una funcionalidad similar a la del tipo de tabla anidada de Oracle.

CREATE TYPE NTT_DEMO AS
(
ID NUMERIC(6),
NAME VARCHAR(20)
);
CREATE TABLE NTT_TABLE (
RECORD NTT_DEMO[]
);

Tipo incompleto Los tipos incompletos son tipos sin atributos ni métodos. Otros tipos pueden hacer referencia a ellos. Sin embargo, debes proporcionar la definición del tipo antes de usarlo.

CREATE TYPE INCOMPLETE_DEMO;

No N/A

Usuarios

En esta sección se explica cómo crear usuarios y asignar permisos, así como la necesidad de convertir tablas de Oracle en tablas de Cloud SQL para PostgreSQL.

Creación de usuarios y permisos

Las cuentas de usuario de la base de datos de Oracle (los términos "usuario" y "esquema" de Oracle son idénticos) se pueden usar para autenticar y conectar con sesiones de bases de datos, mientras que el acceso de autorización se define a nivel de usuario para objetos o permisos de bases de datos específicos.

En general, hay dos tipos de usuarios de bases de datos:

  • Administradores: gestionan la instancia de base de datos, los usuarios y los recursos.
  • Cuentas de usuario: sirven para operaciones lógicas, como aplicaciones.

Los administradores conceden privilegios a las cuentas de usuario y de usuario de aplicación para acceder a los objetos de la base de datos. Los permisos de la base de datos de Oracle se conceden a un usuario para operaciones específicas (por ejemplo, crear una sesión o conectarse) o para objetos de base de datos específicos (por ejemplo, SELECT en una tabla específica o EXECUTE en un procedimiento almacenado específico).

En Oracle, existen los conceptos de usuarios y roles. Los usuarios están acostumbrados a autenticarse con la base de datos y los roles proporcionan una agrupación de permisos que se pueden conceder en su totalidad.

En Cloud SQL para PostgreSQL, los usuarios y los roles son sinónimos. Un usuario de Cloud SQL para PostgreSQL es un rol con permiso connect. Puedes usar la instrucción CREATE USER o CREATE ROLE para crear un usuario de base de datos. A diferencia de Oracle, en Cloud SQL para PostgreSQL, los esquemas y los usuarios se crean por separado. Un esquema es una colección de objetos (por ejemplo, tablas, tipos de datos, funciones, etc.) que pertenece a un usuario.

Oracle Create User
CREATE USER user_name IDENTIFIED BY password;
Cloud SQL para PostgreSQL Create User
CREATE USER user WITH PASSWORD 'password';

O

CREATE ROLE user WITH LOGIN PASSWORD 'password';

Consideraciones sobre las conversiones

  • Los usuarios se definen en el nivel raíz y son válidos para todas las bases de datos contenidas en el mismo clúster de Cloud SQL para PostgreSQL. Es similar a los "usuarios comunes" de Oracle 12c.
  • La sintaxis de CREATE USER de Cloud SQL para PostgreSQL es diferente de la de Oracle y no se puede migrar tal cual. CREATE USER en Cloud SQL para PostgreSQL es un alias de CREATE ROLE, excepto que la opción LOGIN está habilitada de forma predeterminada.

Tablas

Las tablas de Oracle se componen de muchos elementos, como tipos de datos de columna, restricciones de tabla, índices, particiones, funciones propias de las tablas de Oracle y más. Para migrar correctamente a las tablas de la base de datos de Cloud SQL para PostgreSQL, todos los elementos de las tablas de Oracle deben convertirse en tablas de Cloud SQL para PostgreSQL. Algunos elementos se admiten sin modificaciones o con modificaciones menores, mientras que otros deben modificarse por completo.

Desde el punto de vista de la migración, convertir PL/SQL a Cloud SQL para PostgreSQL probablemente requiera más esfuerzo, ya que convertir tablas de Oracle a tablas de Cloud SQL para PostgreSQL es una fase crucial con una importancia significativa y más implicaciones en el rendimiento y el tamaño de los datos.

A continuación, se indican las principales diferencias entre las tablas de Oracle y Cloud SQL para PostgreSQL, así como las funciones relacionadas. Estas diferencias se analizan en el resto de la serie.

  • Sintaxis para crear tablas
  • Metadatos de tablas e índices
  • Compatibilidad con restricciones
  • Tipos de datos admitidos y limitaciones
  • Índices
  • Particiones y gestión de particiones
  • Mantenimiento de tablas e índices
  • Tablas temporales
  • Vistas
  • Columnas visibles e invisibles (Oracle 12c)
  • Conjuntos de caracteres de tablas y columnas

Siguientes pasos