A veces necesitamos una tabla que tendrá la misma estructura o una estructura muy similar, a la de una tabla ya existente.

En casos así nos ahorraríamos un montón de tiempo si en lugar de volver a escribir todas las columnas, la Primary Key, las Foreign keys, los Check, los Unique, los índices y quizás los datos, pudiéramos hacer todo eso automáticamente.

Bien, la buena noticia es que sí se puede.

Todos los programas administradores gráficos tienen esa opción, en este artículo mostraremos como hacerlo con el EMS SQL Manager.

DUPLICATE01

Captura 1. Si haces clic en la imagen la verás más grande

  1. Nos conectamos a la Base de Datos donde se encuentra la tabla que queremos duplicar
  2. Expandimos “Tables” para que nos muestre los nombres de todas las tablas
  3. Hacemos clic con el botón derecho sobre el nombre de la tabla que queremos duplicar
  4. Hacemos clic en la opción: “Duplicate Table ‘MiTabla'”

DUPLICATE02

Captura 2. Si haces clic en la imagen la verás más grande

En “Target database” elegimos a la Base de Datos que tendrá a la nueva tabla. Puede ser cualquier Base de Datos a la cual estemos conectados. Si no estamos conectados a esa Base de Datos, debemos conectarnos y repetir el proceso desde la Captura 1.

En “New object name” ponemos el nombre que tendrá la nueva tabla. Si se copiará dentro de la misma Base de Datos, el nombre debe ser distinto (porque no podemos tener 2 tablas con el mismo nombre). Si se copiará en otra Base de Datos el nombre puede ser igual (o sea que podemos borrar el sufijo _NEW).

Si marcamos “Copy data” entonces se copiará la estructura de la tabla (es decir, sus metadatos) y también el contenido de todas las filas que contiene.

Si marcamos “Deactivate triggers while data copying” entonces las filas de la tabla original se copiarán en la nueva tabla sin que se ejecuten los triggers de esta última. ¿Cuándo haríamos algo así? Por ejemplo cuando queremos que los identificadores de ambas tablas sean idénticos. Por ejemplo, los identificadores de la tabla original son 1, 4, 8, 9, 11, 12. Si queremos que la nueva tabla tenga esos mismos identificadores entonces debemos desactivar los triggers porque si no los desactivamos los identificadores de la nueva tabla serán: 1, 2, 3, 4, 5, 6.

Si marcamos “Copy privilegies” entonces se copiarán los derechos de acceso de los usuarios y de los roles. Si no marcamos esta opción entonces a la nueva tabla solamente podrán acceder el usuario SYSDBA, el creador de la Base de Datos, y los usuarios que se conecten con el rol RDB$ADMIN. En cambio si la marcamos, todos los usuarios y roles que tenían acceso a la tabla original también tendrán acceso a la nueva tabla.

DUPLICATE03

Captura 3. Si haces clic en la imagen la verás más grande

En la siguiente pantalla (que vemos en la Captura 3.) debemos elegir los nombres que tendrán los nuevos objetos. Si la tabla será copiada en la misma Base de Datos no podemos tener dos objetos con el mismo nombre, por eso el EMS SQL Manager automáticamente les agregó el sufijo _NEW a todos los objetos. De esa manera nos ayuda para que no tengamos nombres de objetos duplicados. Sin embargo, si la tabla será copiada en otra Base de Datos podríamos eliminar todos los sufijos _NEW para que los nombres de los objetos de la tabla original y de la tabla duplicada sean idénticos.

DUPLICATE04

Captura 4. Si haces clic en la imagen la verás más grande

En la Captura 4. vemos que podemos eliminar los sufijos _NEW sin problema. Pero recuerda que esto solamente puedes hacer si la tabla se copiará a otra Base de Datos.

DUPLICATE05

Captura 5. Si haces clic en la imagen la verás más grande

El último paso, tal y como puedes ver en la Captura 5. es hacer clic sobre el botón “Run”. Si todo está ok, entonces la tabla será duplicada.

¿Qué puede salir mal?

A veces cuando queremos duplicar una tabla no lo conseguimos porque ocurre algún error. Algunos de los más comunes son:

  • “Name longer than database column size”. El nombre de los objetos en Firebird es como máximo 31. Y a veces cuando le agrega el sufijo _NEW se sobrepasa ese límite. Verifica en la Captura 3. y en la Captura 4. que no haya nombres con más de 31 caracteres.
  • “Table unknown”. Si alguna de las restricciones o de los triggers en la tabla original hace referencia a una tabla que no se encuentra en la Base de Datos destino, verás este error. La solución es primero copiar esa otra tabla.
  • “Tabla unknown”. También verás este error si la tabla no pudo crearse. Eso generalmente ocurre cuando la tabla original usa un dominio que no se encuentra en la Base de Datos destino. La solución por lo tanto es duplicar previamente el dominio inexistente.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21