Supongamos que tienes un dominio y decides cambiarlo. Ese dominio quizás está siendo usado en muchas tablas, algunas de las cuales pueden tener millones y millones de filas.

No puedes cambiar un dominio para que guarde menos datos que antes, pero sí puedes cambiarlo para que guarde más datos que antes. Cambiar de INTEGER a SMALLINT no está permitido. Cambiar de SMALLINT a INTEGER sí está permitido. Cambiar de CHAR(10) a CHAR(2) no está permitido. Cambiar de CHAR(2) a CHAR(10) sí está permitido.

Así que veamos lo que ocurrirá cuando quieres cambiar un dominio y está permitido hacerlo.

Ejemplos:

D_PRECIO1 DECIMAL(9, 2) quieres cambiar a D_PRECIO1 DECIMAL(18, 2)

D_APELLIDOS VARCHAR(20) quieres cambiar a D_APELLIDOS VARCHAR(25)

¿Cómo actuará el Firebird en una situación así?

Cambiar cada fila de cada tabla que usa el dominio no es práctico, es totalmente improductivo, porque algunas tablas pueden tener millones y millones de filas y estar siendo usadas por cientos o miles de usuarios. Hacer algo así demoraría mucho tiempo y además podría causar un sinfín de problemas.

Por lo tanto, lo que el Firebird hace es lo siguiente:

  1. Cuando se cambia un dominio, no altera a ninguna columna de ninguna tabla. Todo sigue igual en las tablas que creó el desarrollador.
  2. Los que sí cambian son los metadatos, las estructuras de las tablas que usan ese dominio son cambiadas.
  3. Cuando se hace un INSERT, usa el nuevo dominio en la fila insertada
  4. Cuando se hace un UPDATE, usa el nuevo dominio en la fila actualizada (recuerda que cada UPDATE crea una nueva fila. Y en esa nueva fila se usará el nuevo dominio). La fila original no se toca, queda como estaba.
  5. Cuando se hace un SELECT, las filas que tienen el dominio viejo serán cambiadas en memoria para que tengan el dominio nuevo, así que al ver las filas obtenidas se las verá con el dominio nuevo. Las filas no son cambiadas en la Base de Datos, el cambio se hace solamente en la memoria RAM de la computadora del Servidor.

¿Es posible conseguir que todas las columnas de todas las tablas utilicen el nuevo dominio?

Sí. Usando GBAK para hacer un ciclo backup/restore la Base de Datos restaurada tendrá todas las columnas con el nuevo dominio.

GBAK hará que todas las columnas de todas las filas de todas las tablas estén estructuradas con los últimos dominios definidos.

Recuerda que la Base de Datos original no se cambia, queda como estaba, la que se cambia es la Base de Datos restaurada.

Conclusión:

El Firebird permite cambiar la definición de un dominio, si el nuevo dominio permitirá guardar más datos que el viejo dominio.

Cuando se cambia un dominio, se cambia la estructura de las tablas que usan ese dominio (es decir, los metadatos) pero no se cambian las filas que insertaron los usuarios. Esas filas quedan igual, no se tocan.

Cambiar las filas que insertaron los usuarios demoraría mucho tiempo y podría causar muchos problemas, sería una idea muy mala, por lo tanto el Firebird hace lo más inteligente:

Cuando se hace un INSERT, se usa el nuevo dominio. Cuando se hace un UPDATE, en la fila actualizada se usa el nuevo dominio. Cuando se hace un SELECT, las filas que tenían el dominio viejo se cambian en memoria para que tengan el dominio nuevo y así los usuarios puedan ver esas columnas con el dominio nuevo.

Si se desea que todas las columnas usen físicamente el nuevo dominio, hay que hacer un ciclo backup/restore usando el programa GBAK. Así, la Base de Datos restaurada tendrá a todas sus columnas estructuradas con los últimos dominios definidos.

Artículos relacionados:

Entendiendo a los metadatos del programador

Entendiendo a los dominios

La forma más fácil de cambiar un dominio

El índice del blog Firebird21

El foro del blog Firebird21