lunes, 18 de septiembre de 2017

Oracle 12c R2 - Identificadores de 128 Bytes

Seguramente, mas de una vez cada desarrollador o administrador de Oracle sufrió un dolor de cabeza al tener que crear un objeto y encontrarse con la limitación de treinta caracteres para los nombres de objetos (identificadores).

Por ejemplo, si queríamos correr el siguiente script:

CREATE TABLE t_EstadoComprobante
( ID_EstadoComprobante      NUMBER(4)       NOT NULL,
  EstadoComprobante         VARCHAR(50)     NOT NULL
);
--
ALTER TABLE t_EstadoComprobante
    ADD CONSTRAINT PK_EstadoComprobante
        PRIMARY KEY (ID_EstadoComprobante);
--
CREATE TABLE t_Comprobante
( ID_Comprobante            NUMBER(4)       NOT NULL,
  Numero_Comprobante        NUMBER(8)       NOT NULL,
  Fecha_Comprobante         DATE            NOT NULL,
  Monto_Comprobante         NUMBER(12,2)    NOT NULL,
  ID_EstadoComprobante      NUMBER(4)       NOT NULL
);
--
ALTER TABLE t_Comprobante
    ADD CONSTRAINT PK_Comprobante
        PRIMARY KEY (ID_Comprobante);
--
ALTER TABLE t_Comprobante 
    ADD CONSTRAINT FK_Comprobante_EstadoComprobante 
        FOREIGN KEY (ID_EstadoComprobante)
        REFERENCES t_EstadoComprobante (ID_EstadoComprobante);
--

Nos encontrábamos con el siguiente mensaje de error.

ORA-00972: identifier is too long
00972. 00000 -  "identifier is too long"
*Cause:    An identifier with more than 30 characters was specified.
*Action:   Specify at most 30 characters.

La limitación de 30 caracteres obligaba a utilizar abreviaturas para nombrar a identificadores, haciendo poco legibles (y hasta inentendibles) ciertos nombres.

Identificadores Largos (hasta 128 bytes) en Oracle 12c R2

La nueva versión de Oracle soporta identificadores de hasta 128 bytes, por lo que de ejecutar el script anterior en una base de datos 12c R2, obtendremos el siguiente resultado:

Table created.
Table altered.
Table created.
Table altered.
Table altered.
Si consultamos la estructura de las tablas del diccionario de datos, podemos ver que la mayoria de las columnas de las vistas del diccionario de datos que contienen identificadores ahora tienen un tamaño de 128 bytes:

SQL> desc all_tables
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(128)
 TABLE_NAME                                NOT NULL VARCHAR2(128)
 TABLESPACE_NAME                                    VARCHAR2(30)
 CLUSTER_NAME                                       VARCHAR2(128)
 ...
 ...

Restricciones y Consideraciones

Los siguientes objetos mantienen sus identificadores con el largo como en versiones anteriores.
  • 8 Bytes
    • Nombre de Base de Datos
  • 30 Bytes
    • Tablespace
    • Disk Group
    • PDBs
    • Rollback Segment
Otro aspecto a tener en cuenta es que el nuevo tamaño se mide en Bytes, por lo que si nuestra base de datos tiene un set de caracteres UTF8, cada caracter puede ocupar entre 1 y 3 bytes, por lo que el tamaño máximo en caracteres del identificador puede ser menor, como vemos a continuación:

create table tablááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááááá 
(
  Son_67_Caracteres_pero_ocupan_130_bytes int
);

ORA-00972: identifier is too long


No hay comentarios.:

Publicar un comentario