Necesito cambiar el nombre de una tabla en Oracle, pero quiero estar seguro de que cualquier claves externas, restricciones, disparadores y las secuencias que hacen referencia a la tabla se actualiza para utilizar el nuevo nombre.

¿Cómo puedo estar seguro de que no me he roto nada?

Nota que quiero preservar los datos que contiene la tabla.

OriginalEl autor Warren Blumenow | 2012-02-14

3 Comentarios

  1. 12

    Depende de lo que entendemos por «cualquier claves externas, restricciones, disparadores y las secuencias que hacen referencia a la tabla se actualiza para utilizar el nuevo nombre.»

    Los índices existentes, limitaciones, y dispara contra la mesa con el nuevo nombre automáticamente referencia al nuevo nombre.

    Sin embargo, ninguna de las convenciones de nomenclatura utilizada para los objetos no usar automáticamente el nombre actualizado. Por ejemplo, si la clave principal para TABLE_NAME es generalmente nombrado TABLE_NAME_PK, el cambio de nombre de TABLE_NAME a NEW_TABLE_NAME no cambiar automáticamente el nombre de la restricción de clave principal para NEW_TABLE_NAME_PK.

    Lo que deberá ser revisado código de paquetes, procedimientos y funciones, que hace referencia al antiguo nombre de la tabla, así como los desencadenantes que hace referencia el antiguo nombre de la tabla. Asimismo, los puntos de vista contra el antiguo nombre de la tabla va a romper así. La vista ALL_DEPENDENCIES puede ayudar a identificar cuáles de esos objetos necesitan ser actualizados.

    Gracias Adán. @Justin sugirió que desencadena seguirá funcionando correctamente. Estás diciendo que voy a necesitar para corregir manualmente los factores desencadenantes? Por ejemplo, si yo tenía un autoincrement trigger (CREATE TRIGGER trg_bi_foo ANTES de la INSERCIÓN EN foo PARA CADA FILA de COMENZAR a SELECCIONAR seq_foo.NEXTVAL EN :NUEVO.foo_id FROM DUAL; END;) sería el «ANTES de la INSERCIÓN EN foo» se actualiza automáticamente a «ANTES de INSERTAR EN la barra»?
    Sí. Pero si tienes algún otro desencadenante en alguna otra tabla en la que se realiza una consulta contra foo, que desencadenan no se actualiza automáticamente para consulta en bar.

    OriginalEl autor Adam Musch

  2. 19

    Si

    ALTER TABLE old_table_name
     RENAME TO new_table_name;

    todas las limitaciones existentes (clave externa y otras restricciones) y desencadena hará referencia a los objetos recién cambiado de nombre. Las secuencias no tienen ninguna relación con las tablas de modo que no habrá ningún impacto en las secuencias (aunque si te refieres a que se hace referencia a la secuencia en un trigger en la tabla, el gatillo seguirán haciendo referencia a la misma secuencia después de que el cambio de nombre). Ninguno de los procedimientos almacenados que usted ha escrito que la referencia al antiguo nombre de la tabla, sin embargo, tendrá que ser actualizado para hacer referencia al nuevo nombre de la tabla.

    Ahora, mientras que los condicionantes y desencadenantes seguirá funcionando correctamente, que conservan sus nombres originales. Si usted tiene las convenciones de nomenclatura para estos objetos que desea mantener después el nombre de la tabla, usted tendría que hacer más. Por ejemplo, si desea un nivel de fila antes de desencadenador de inserción en la tabla FOO a ser nombrado TRG_BI_FOO y cambiar el nombre de la tabla a BAR, sería necesario modificar el gatillo de forma explícita a cambiar su nombre

    ALTER TRIGGER trg_bi_foo
      RENAME TO trg_bi_bar;

    Del mismo modo, sería necesario cambiar el nombre de sus limitaciones y de los índices de

    ALTER TABLE bar
      RENAME CONSTRAINT pk_foo TO pk_bar;

    OriginalEl autor Justin Cave

  3. 1
    ALTER TABLE oldName RENAME TO newName

    De preservar la tabla de dependencias y de los datos, pero no siempre puede ser un pedazo de PL/SQL que hace referencia al antiguo nombre de lo que va a ser válido.

    OriginalEl autor vc 74

Dejar respuesta

Please enter your comment!
Please enter your name here