Compartir a través de


Realizar cambios de esquema en bases de datos de publicación

La replicación admite una amplia gama de cambios de esquema en los objetos publicados. Al realizar cualquiera de los siguientes cambios de esquema en el objeto publicado adecuado en un publicador de Microsoft SQL Server, ese cambio se propaga de forma predeterminada a todos los suscriptores de SQL Server:

  • ALTER TABLE

  • ALTER TABLE SET LOCK ESCALATION no se debe usar si la replicación de cambios de esquema está habilitada y una topología incluye SQL Server 2005 o suscriptores de SQL Server Compact 3.5.ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

    ALTER TRIGGER solo se puede usar para desencadenadores del lenguaje de manipulación de datos [DML] porque los desencadenadores del lenguaje de definición de datos [DDL] no se pueden replicar.

Importante

Los cambios de esquema en las tablas se deben realizar mediante Transact-SQL o objetos de administración de SQL Server (SMO). Cuando se realizan cambios de esquema en SQL Server Management Studio, Management Studio intenta quitar y volver a crear la tabla. No se pueden quitar objetos publicados, por lo que se produce un error en el cambio de esquema.

Para la replicación transaccional y la replicación de mezcla, los cambios de esquema se propagan incrementalmente cuando se ejecuta el Agente de distribución o el Agente de mezcla. Para la replicación de instantáneas, los cambios en el esquema se propagan cuando se aplica una nueva instantánea al suscriptor. En la replicación de instantáneas, se envía una nueva copia del esquema al suscriptor cada vez que se produce la sincronización. Por lo tanto, todos los cambios de esquema (no solo los enumerados anteriormente) a los objetos publicados anteriormente se propagan automáticamente con cada sincronización.

Para obtener información sobre cómo agregar y quitar artículos de publicaciones, vea Agregar artículos a y quitar artículos de publicaciones existentes.

Para replicar los cambios de esquema

Los cambios de esquema enumerados anteriormente se replican de forma predeterminada. Para obtener información sobre cómo deshabilitar la replicación de los cambios de esquema, consulte Replicación de cambios de esquema.

Consideraciones para los cambios de esquema

Tenga en cuenta las siguientes consideraciones al replicar los cambios de esquema.

Consideraciones generales

  • Los cambios de esquema están sujetos a restricciones impuestas por Transact-SQL. Por ejemplo, ALTER TABLE no permite modificar las columnas de clave principal.

  • La asignación de tipos de datos solo se realiza para la instantánea inicial. Los cambios de esquema no se asignan a versiones anteriores de tipos de datos. Por ejemplo, si la instrucción ALTER TABLE ADD datetime2 column se usa en SQL Server 2012, el tipo de datos no se traduce a nvarchar para suscriptores de SQL Server 2005. En algunos casos, los cambios de esquema se bloquean en el publicador.

  • Si se establece una publicación para permitir la propagación de cambios de esquema, los cambios de esquema se propagan independientemente de cómo se establezca la opción de esquema relacionada para un artículo de la publicación. Por ejemplo, si selecciona no replicar restricciones de clave externa para un artículo de tabla, pero luego emite un comando ALTER TABLE que agrega una clave externa a la tabla en el publicador, la clave externa se agrega a la tabla en el suscriptor. Para evitar esto, deshabilite la propagación de los cambios de esquema antes de emitir el comando ALTER TABLE.

  • Los cambios de esquema solo deben realizarse en el publicador, no en los suscriptores (incluidos los suscriptores que vuelven a publicar). La replicación de mezcla impide cambios de esquema en el lado del suscriptor. La replicación transaccional no impide los cambios, pero los cambios pueden provocar un error en la replicación.

  • Los cambios que se propagan a un suscriptor de republicación, por defecto, también se propagan a sus respectivos suscriptores.

  • Si el cambio de esquema hace referencia a objetos o restricciones existentes en el publicador, pero no en el suscriptor, el cambio de esquema se realizará correctamente en el publicador, pero producirá un error en el suscriptor.

  • Todos los objetos del suscriptor al que se hace referencia al agregar una clave externa deben tener el mismo nombre y propietario que el objeto correspondiente en el publicador.

  • No se admite la adición, eliminación o modificación explícita de índices. Se admiten los índices creados implícitamente para las restricciones (como una restricción de clave principal).

  • No se admite la modificación o eliminación de columnas de identidad administradas por la replicación. Para obtener más información sobre la administración automática de columnas de identidad, consulte Replicación de columnas de identidad.

  • Los cambios de esquema que incluyen funciones no deterministas no se admiten porque pueden dar lugar a que los datos del publicador y el suscriptor sean diferentes (denominados no convergencia). Por ejemplo, si emite el siguiente comando en el publicador: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), los valores son diferentes cuando el comando se replica en el suscriptor y se ejecuta. Para obtener más información sobre las funciones no deterministas, vea Funciones deterministas y no deterministas.

  • Se recomienda que las restricciones se nombren explícitamente. Si una restricción no se denomina explícitamente, SQL Server genera un nombre para la restricción y estos nombres serán diferentes en el publicador y en cada suscriptor. Esto puede causar problemas durante la replicación de cambios de esquema. Por ejemplo, si quita una columna en el Publicador y se quita una restricción dependiente, la replicación intentará quitar la restricción en el Suscriptor. El proceso de eliminación en el suscriptor fallará porque el nombre de la restricción es diferente. Si se produce un error en la sincronización debido a un problema de nomenclatura de restricciones, quite manualmente la restricción en el suscriptor y vuelva a ejecutar el Agente de mezcla.

  • Si se publica una tabla para la replicación, no es posible modificar una columna de esa tabla a un tipo de datos XML si ya se ha generado una instantánea de publicación Para modificar la columna, primero debe quitar la replicación.

  • La lectura sin confirmar no es un nivel de aislamiento admitido cuando se realiza DDL en una tabla publicada.

  • SET CONTEXT_INFO no debe usarse para modificar el contexto de las transacciones en las que se realizan cambios de esquema en objetos publicados.

Agregar columnas

  • Para agregar una nueva columna a una tabla e incluir esa columna en una publicación existente, ejecute ALTER TABLE <Table> ADD <Column>. De forma predeterminada, la columna se replica en todos los suscriptores. La columna debe permitir valores NULL o incluir una restricción predeterminada. Para obtener más información sobre cómo agregar columnas, vea la sección "Replicación de combinación" de este tema.

  • Para agregar una nueva columna a una tabla y no incluir esa columna en una publicación existente, deshabilite la replicación de cambios de esquema y, a continuación, ejecute ALTER TABLE <Table> ADD <Column>.

  • Para incluir una columna existente en una publicación existente, use sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) o el cuadro de diálogo Propiedades de la publicación - <Publicación>.

    Para obtener más información, vea Definir y modificar un filtro de columna. Esto requerirá que se reinicialicen las suscripciones.

  • No se admite la adición de una columna de identidad a una tabla publicada, ya que puede dar lugar a una no convergencia cuando la columna se replica en el suscriptor. Los valores de la columna de identidad del publicador dependen del orden en que se almacenan físicamente las filas de la tabla afectada. Las filas se pueden almacenar de forma diferente en el suscriptor; por lo tanto, el valor de la columna de identidad puede ser diferente para las mismas filas.

Eliminar columnas

  • Para eliminar una columna de una publicación existente y eliminar la columna de la tabla en el publicador, ejecute ALTER TABLE <Table> DROP <Column>. De forma predeterminada, la columna se elimina de la tabla en todos los Suscriptores.

  • Para quitar una columna de una publicación existente, pero conservar la columna en la tabla en el Editor, use sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) o el cuadro de diálogo Propiedades de la Publicación - <Publicación>.

    Para obtener más información, vea Definir y modificar un filtro de columna. Esto requerirá que se genere una nueva instantánea.

  • La columna que se va a quitar no se puede usar en las cláusulas de filtro de ningún artículo de ninguna publicación de la base de datos.

  • Al quitar una columna de un artículo publicado, tenga en cuenta las restricciones, índices o propiedades de la columna que podrían afectar a la base de datos. Por ejemplo:

    • No se pueden eliminar columnas usadas en una clave principal en los artículos de las publicaciones transaccionales, ya que se usan en la replicación.

    • No se puede quitar la columna rowguid de los artículos en publicaciones de mezcla ni la columna mstran_repl_version de los artículos en publicaciones transaccionales que permiten actualizar suscripciones, porque se utilizan en procesos de replicación.

    • Los cambios de índice no se propagan a los Suscriptores: si se elimina una columna en el Publicador y se elimina un índice dependiente, la eliminación del índice no se replica. Debe eliminar el índice en el suscriptor antes de eliminar la columna en el publicador, de modo que la eliminación de la columna se realice correctamente cuando se replique desde el publicador al suscriptor. Si se produce un error en la sincronización debido a un índice en el suscriptor, quite manualmente el índice y vuelva a ejecutar el Agente de mezcla.

    • Se debe asignar un nombre explícito a las restricciones para permitir la eliminación. Para obtener más información, vea la sección "Consideraciones generales" anteriormente en este tema.

Replicación transaccional

  • Los cambios de esquema se propagan a los suscriptores que ejecutan versiones anteriores de SQL Server, pero la instrucción DDL solo debe incluir la sintaxis admitida por la versión en el suscriptor.

    Si el suscriptor vuelve a publicar los datos, los únicos cambios de esquema admitidos son agregar y eliminar columnas. Estos cambios deben realizarse en el publicador mediante sp_repladdcolumn (Transact-SQL) y sp_repldropcolumn (Transact-SQL) en lugar de la sintaxis DDL de ALTER TABLE.

  • Los cambios de esquema no se replican en suscriptores que utilizan otro software distinto a SQL Server.

  • Los cambios de esquema no se propagan desde publicadores que no son de SQL Server.

  • No se pueden modificar las vistas indizadas que se replican como tablas. Las vistas indizadas que se replican como vistas indizadas se pueden modificar, pero modificarlas harán que se conviertan en vistas normales, en lugar de vistas indizadas.

  • Si la publicación admite la actualización inmediata o las suscripciones de actualización en cola, el sistema debe estar inactivo antes de realizar cambios de esquema: toda la actividad de la tabla publicada debe detenerse en el publicador y los suscriptores, y los cambios de datos pendientes deben propagarse a todos los nodos. Una vez que los cambios de esquema se hayan propagado a todos los nodos, la actividad se puede reanudar en las tablas publicadas.

  • Si la publicación está en una topología punto a punto, el sistema debe estar en estado de reposo antes de realizar cambios en el esquema. Para más información, vea Poner en modo inactivo una topología de replicación (programación de la replicación con Transact-SQL).

  • Agregar una columna de marca de tiempo a una tabla y asignar la marca de tiempo a binary(8) hace que el artículo se reinicialice para todas las suscripciones activas.

Replicación de mezcla

  • La forma en que la replicación de mezcla controla los cambios de esquema viene determinada por el nivel de compatibilidad de la publicación y si la instantánea se establece en modo nativo (valor predeterminado) o modo de caracteres:

    • Para replicar los cambios de esquema, el nivel de compatibilidad de la publicación debe ser al menos 90RTM. Si los suscriptores ejecutan versiones anteriores de SQL Server o el nivel de compatibilidad es inferior a 90RTM, puede usar sp_repladdcolumn (Transact-SQL) y sp_repldropcolumn (Transact-SQL) para agregar y quitar columnas. Sin embargo, estos procedimientos están en desuso.

    • Si intenta agregar a un artículo existente una columna con un tipo de datos que se introdujo en SQL Server 2008, SQL Server tiene el siguiente comportamiento:

      100RTM, instantánea nativa 100RTM, instantánea de caracteres Todos los demás niveles de compatibilidad
      hierarchyid Permitir cambio Bloquear cambio Bloquear cambio
      geography y geometry Permitir cambio Permitir el cambio1 Bloquear cambio
      filestream Permitir cambio Bloquear cambio Bloquear cambio
      date, time, datetime2y datetimeoffset Permitir cambio Permitir el cambio1 Bloquear cambio

      1 Los suscriptores de SQL Server Compact convierten estos tipos de datos en el lado del suscriptor.

  • Si se produce un error al aplicar un cambio de esquema (por ejemplo, un error resultante de agregar una clave externa que hace referencia a una tabla que no está disponible en el suscriptor), se produce un error en la sincronización y se debe reinicializar la suscripción.

  • Si se realiza un cambio de esquema en una columna implicada en un filtro de combinación o filtro con parámetros, debe reinicializar todas las suscripciones y volver a generar la instantánea.

  • La replicación de mezcla proporciona procedimientos almacenados para omitir los cambios de esquema durante la solución de problemas. Para obtener más información, vea sp_markpendingschemachange (Transact-SQL) y sp_enumeratependingschemachanges (Transact-SQL).

Véase también

MODIFICAR TABLA (Transact-SQL)
ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
Publicar datos y objetos de base de datos
Regeneración de procedimientos transaccionales personalizados para reflejar los cambios de esquema