Realizar cambios de esquema en bases de datos de publicacionesMake Schema Changes on Publication Databases

La replicación admite una gran variedad de cambios en el esquema de objetos publicados.Replication supports a wide range of schema changes to published objects. Cuando se realiza cualquiera de los siguientes cambios de esquema en el objeto publicado apropiado en un publicador de MicrosoftMicrosoft SQL ServerSQL Server , dicho cambio se propaga de manera predeterminada a todos los suscriptores de SQL ServerSQL Server :When you make any of the following schema changes on the appropriate published object at a MicrosoftMicrosoft SQL ServerSQL Server Publisher, that change is propagated by default to all SQL ServerSQL Server Subscribers:

  • ALTER TABLEALTER TABLE

  • ALTER TABLE SET LOCK ESCALATION no se debería usar si la replicación de cambio de esquema está habilitada y una topología incluye Resultado deSQL Server 2005 o SQL Server Compact 3.5SQL Server Compact 3.5 Subscribers.ALTER VIEWALTER TABLE SET LOCK ESCALATION should not be used if schema change replication is enabled and a topology includes Resultado deSQL Server 2005 or SQL Server Compact 3.5SQL Server Compact 3.5 Subscribers.ALTER VIEW

  • ALTER PROCEDUREALTER PROCEDURE

  • ALTER FUNCTIONALTER FUNCTION

  • ALTER TRIGGERALTER TRIGGER

    ALTER TRIGGER solo puede utilizarse para desencadenadores de lenguaje de manipulación de datos (DML), ya que los desencadenadores de lenguaje de definición de datos (DDL) no se pueden replicar.ALTER TRIGGER can be used only for data manipulation language [DML] triggers because data definition language [DDL] triggers cannot be replicated.

Importante

Los cambios de esquema de las tablas deben realizarse con Transact-SQLTransact-SQL u Objetos de administración de SQL ServerSQL Server (SMO).Schema changes to tables must be made by using Transact-SQLTransact-SQL or SQL ServerSQL Server Management Objects (SMO). Cuando se realizan cambios de esquema en SQL Server Management StudioSQL Server Management Studio, Management StudioManagement Studio intenta quitar y volver a crear la tabla.When schema changes are made in SQL Server Management StudioSQL Server Management Studio, Management StudioManagement Studio attempts to drop and re-create the table. Debido a que no es posible quitar objetos publicados, se produce un error en el cambio de esquema.You cannot drop published objects, therefore the schema change fails.

En la replicación transaccional y de mezcla, los cambios de esquema se propagan de forma incremental al ejecutar el Agente de distribución o el Agente de mezcla.For transactional replication and merge replication, schema changes are propagated incrementally when the Distribution Agent or Merge Agent runs. En la replicación de instantáneas, los cambios de esquema se propagan al aplicar una nueva instantánea en el suscriptor.For snapshot replication, schema changes are propagated when a new snapshot is applied at the Subscriber. 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.In snapshot replication, a new copy of the schema is sent to the Subscriber each time synchronization occurs. Por tanto, todos los cambios de esquema (y no solo los indicados antes) en objetos previamente publicados se propagan automáticamente con cada sincronización.Therefore, all schema changes (not just those listed above) to previously published objects are automatically propagated with each synchronization.

Para obtener información sobre cómo agregar y quitar artículos de publicaciones, vea Agregar y quitar artículos de publicaciones existentes.For information about adding and removing articles from publications, see Add Articles to and Drop Articles from Existing Publications.

Para replicar cambios de esquemaTo replicate schema changes

Los cambios de esquema antes indicados se replican de manera predeterminada.The schema changes listed above are replicated by default. Para obtener información acerca de cómo deshabilitar la replicación de los cambios de esquema, vea Replicate Schema Changes.For information about disabling the replication of schema changes, see Replicate Schema Changes.

Consideraciones para los cambios de esquemaConsiderations for Schema Changes

Tenga en cuenta las consideraciones siguientes al replicar cambios de esquema.Keep the following considerations in mind when replicating schema changes.

Consideraciones generalesGeneral Considerations

  • Los cambios de esquema están sujetos a las restricciones impuestas por Transact-SQLTransact-SQL.Schema changes are subject to any restrictions imposed by Transact-SQLTransact-SQL. Por ejemplo, ALTER TABLE no permite aplicar ALTER a las columnas de clave principal.For example, ALTER TABLE does not allow you to ALTER primary key columns.

  • La asignación de tipo de datos solo se realiza para la instantánea inicial.Data type mapping is performed only for the initial snapshot. Los cambios de esquema no se asignan a versiones anteriores de tipos de datos.Schema changes are not mapped to previous versions of data types. Por ejemplo, si la instrucción ALTER TABLE ADD datetime2 column se utiliza en SQL Server 2012SQL Server 2012, el tipo de datos no se traduce a nvarchar para los suscriptores de Resultado deSQL Server 2005 .For example, if the statement ALTER TABLE ADD datetime2 column is used in SQL Server 2012SQL Server 2012, the data type is not translated to nvarchar for Resultado deSQL Server 2005 Subscribers. En algunos casos, los cambios de esquema se bloquean en el publicador.In some cases, schema changes are blocked on the Publisher.

  • Si una publicación está configurada para permitir la propagación de los cambios de esquema, éstos se propagarán independientemente de cómo esté establecida la opción de esquema relacionada para un artículo de la publicación.If a publication is set to allow the propagation of schema changes, schema changes are propagated regardless of how the related schema option is set for an article in the publication. Por ejemplo, si elige no replicar las restricciones de clave externa para un artículo de la tabla y después emite un comando ALTER TABLE que agrega una clave externa a la tabla en el publicador, la clave externa se agregará a la tabla en el suscriptor.For example, if you select not to replicate foreign key constraints for a table article, but then issue an ALTER TABLE command that adds a foreign key to the table at the Publisher, the foreign key is added to the table at the Subscriber. Para evitarlo, deshabilite la propagación de los cambios de esquema antes de emitir el comando ALTER TABLE.To prevent this, disable the propagation of schema changes before issuing the ALTER TABLE command.

  • Los cambios de esquema deben realizarse únicamente en el publicador y no en los suscriptores (incluidos los suscriptores de republicación).Schema changes should be made only at the Publisher, not at Subscribers (including republishing Subscribers). La replicación de mezcla impide los cambios de esquema en el suscriptor.Merge replication prevents schema changes at the Subscriber. La replicación transaccional no impide los cambios, pero los cambios pueden causar errores en la replicación.Transactional replication does not prevent the changes, but the changes can cause replication to fail.

  • Los cambios propagados a un suscriptor de republicación se propagan de manera predeterminada a sus suscriptores.Changes propagated to a republishing Subscriber are by default propagated to its Subscribers.

  • 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 se producirá un error en el suscriptor.If the schema change references objects or constraints existing on the Publisher but not on the Subscriber, the schema change will succeed on the Publisher but will fail on the Subscriber.

  • Todos los objetos del suscriptor a los que se hace referencia al agregar una clave externa deben tener el mismo nombre y propietario que el objeto correspondiente en el publicador.All objects on the Subscriber that are referenced when adding a foreign key must have the same name and owner as the corresponding object on the Publisher.

  • No se permite agregar, quitar ni alterar índices explícitamente.Explicitly adding, dropping, or altering indexes is not supported. Se admiten los índices creados implícitamente para las restricciones (como la restricción de clave principal).Indexes created implicitly for constraints (such as a primary key constraint) are supported.

  • No se permite alterar ni quitar columnas de identidad administradas por la replicación.Altering or dropping identity columns that are managed by replication is not supported. Para obtener más información sobre la administración automática de las columnas de identidad, vea Replicar columnas de identidad.For more information about automatic management of identity columns, see Replicate Identity Columns.

  • No se admiten los cambios de esquema que incluyen funciones no deterministas, ya que pueden producir datos distintos en el publicador y en el suscriptor (falta de convergencia).Schema changes that include nondeterministic functions are not supported because they can result in data at the Publisher and Subscriber being different (referred to as non-convergence). Por ejemplo, si emite en el publicador el comando ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), los valores serán distintos cuando el comando se replique en el suscriptor y se ejecute.For example, if you issue the following command at the Publisher: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), the values are different when the command is replicated to the Subscriber and executed. Para obtener más información acerca de las funciones no deterministas, vea Deterministic and Nondeterministic Functions.For more information about nondeterministic functions, see Deterministic and Nondeterministic Functions.

  • Se recomienda asignar explícitamente un nombre a las restricciones.It is recommended that constraints be explicitly named. Si una restricción no tiene un nombre explícito, SQL ServerSQL Server genera un nombre para la restricción y estos nombres serán diferentes en el publicador y en cada suscriptor.If a constraint is not explicitly named, SQL ServerSQL Server generates a name for the constraint, and these names will be different on the Publisher and each Subscriber. Esto puede causar problemas durante la replicación de cambios de esquema.This can cause issues during the replication of schema changes. 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.For example, if you drop a column at the Publisher and a dependent constraint is dropped, replication will attempt to drop the constraint at the Subscriber. Esta eliminación en el suscriptor no se podrá llevar a cabo porque el nombre de la restricción es diferente.The drop at the Subscriber will fail because the name of the constraint is different. Si no funciona la sincronización por un problema de nombre de restricción, quite manualmente la restricción en el suscriptor y ejecute de nuevo el agente de mezcla.If synchronization fails because of a constraint naming issue, manually drop the constraint at the Subscriber and then rerun the Merge Agent.

  • Si se publica una tabla para la replicación, no se puede modificar una columna de esa tabla a un tipo de datos de XML si ya se ha generado una instantánea de publicación. Para modificar la columna, antes debe quitar la replicación.If a table is published for replication, it is not possible to alter a column in that table to a data type of XML if a publication snapshot has already been generated To alter the column, you must first remove replication.

  • La lectura no confirmada no es un nivel de aislamiento compatible al hacer DDL en una tabla publicada.Read uncommitted is not a supported isolation level when doing DDL on a published table.

  • No se debe usarSET CONTEXT_INFO para modificar el contexto de las transacciones en las que se realizan cambios de esquema en objetos publicados.SET CONTEXT_INFO should not be used to modify the context of transactions where schema changes are performed against published objects.

Agregar columnasAdding Columns

  • Para agregar una columna nueva a una tabla e incluirla en una publicación existente, ejecute ALTER TABLE <tabla> ADD <columna>.To add a new column to a table and include that column in an existing publication, execute ALTER TABLE <Table> ADD <Column>. De manera predeterminada, la columna se replicará en todos los suscriptores.By default, the column is then replicated to all Subscribers. La columna debe admitir valores NULL o incluir una restricción predeterminada.The column must allow NULL values or include a default constraint. Para obtener más información sobre la forma de agregar columnas, consulte la sección "Replicación de mezcla" de este tema.For more information about adding columns, see the "Merge Replication" section in this topic.

  • Para agregar una columna nueva a una tabla sin incluirla en una publicación existente, deshabilite la replicación de los cambios de esquema y después, ejecute ALTER TABLE <tabla> ADD <columna>.To add a new column to a table and not include that column in an existing publication, disable the replication of schema changes, and then execute 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>.To include an existing column in an existing publication, use sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL), or the Publication Properties - <Publication> dialog box.

    Para más información, consulte Define and Modify a Column Filter.For more information, see Define and Modify a Column Filter. Será necesario reinicializar las suscripciones.This will require subscriptions to be reinitialized.

  • No se admite la posibilidad de agregar una columna de identidad a una tabla publicada porque puede dar como resultado la falta de convergencia cuando la columna se replica en el suscriptor.Adding an identity column to a published table is not supported, because it can result in non-convergence when the column is replicated to the Subscriber. Los valores de la columna de identidad en el publicador dependen del orden en que se almacenen físicamente las filas de la tabla afectada.The values in the identity column at the Publisher depend on the order in which the rows for the affected table are physically stored. Las filas se pueden almacenar de forma diferente en el suscriptor; por tanto, el valor de la columna de identidad puede ser diferente para las mismas filas.The rows might be stored differently at the Subscriber; therefore the value for the identity column can be different for the same rows.

Quitar columnasDropping Columns

  • Para quitar una columna de una publicación existente y de la tabla del publicador, ejecute ALTER TABLE <tabla> DROP <columna>.To drop a column from an existing publication and drop the column from the table at the Publisher, execute ALTER TABLE <Table> DROP <Column>. De forma predeterminada, la columna se quitará de la tabla en todos los suscriptores.By default, the column is then dropped from the table at all Subscribers.

  • Para quitar una columna de una publicación existente, pero conservarla en la tabla del publicador, use sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) o el cuadro de diálogo Propiedades de la publicación: <publicación>.To drop a column from an existing publication but retain the column in the table at the Publisher, use sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL), or the Publication Properties - <Publication> dialog box.

    Para más información, consulte Define and Modify a Column Filter.For more information, see Define and Modify a Column Filter. Será necesario generar una instantánea nueva.This will require a new snapshot to be generated.

  • La columna que se quita no puede utilizarse en las cláusulas de filtro de ningún artículo de ninguna publicación de la base de datos.The column to be dropped cannot be used in the filter clauses of any article of any publication in the database.

  • Al quitar una columna de un artículo publicado, tenga en cuenta las restricciones, índices o propiedades de la columna que pudieran afectar a la base de datos.When dropping a column from a published article, take into consideration any constraints, indexes, or properties of the column that could affect the database. Por ejemplo:For example:

    • No puede quitar columnas utilizadas en una clave principal de los artículos en publicaciones transaccionales, ya que se utilizan en la replicación.You cannot drop columns used in a primary key from articles in transactional publications, because they are used by replication.

    • No puede quitar la columna rowguid de los artículos de publicaciones de combinación ni la columna mstran_repl_version de los artículos de publicaciones transaccionales que admiten suscripciones de actualización, ya que se usan en la replicación.You cannot drop the rowguid column from articles in merge publications or the mstran_repl_version column from articles in transactional publications that support updating subscriptions, because they are used by replication.

    • Los cambios de índice no se propagan a los suscriptores: si quita una columna en el publicador y se quita un índice dependiente, la eliminación del índice no se replica.Index changes are not propagated to Subscribers: if you drop a column at the Publisher and a dependent index is dropped, the index drop is not replicated. Debe quitar el índice en el suscriptor antes de quitar la columna en el publicador, de manera que se lleve a cabo correctamente la eliminación de la columna cuando se replique desde el publicador al suscriptor.You should drop the index at the Subscriber before dropping the column at the Publisher, so that the column drop succeeds when it is replicated from the Publisher to the Subscriber. Si no funciona la sincronización debido a un índice en el suscriptor, quite manualmente el índice y ejecute de nuevo el agente de mezcla.If synchronization fails because of an index at the Subscriber, manually drop the index and then rerun the Merge Agent.

    • Las restricciones deben tener un nombre explícito para permitir la eliminación.Constraints should be explicitly named to allow for dropping. Para obtener más información, vea la sección "Consideraciones generales" de este tema.For more information, see the "General Considerations" section earlier in this topic.

Replicación transaccionalTransactional Replication

  • Los cambios de esquema se propagan a los suscriptores que ejecutan versiones anteriores de SQL ServerSQL Server, pero la instrucción DDL solo debe incluir sintaxis compatible con la versión instalada en el suscriptor.Schema changes are propagated to Subscribers running previous versions of SQL ServerSQL Server, but the DDL statement should only include syntax supported by the version at the Subscriber.

    Si el suscriptor vuelve a publicar los datos, los únicos cambios de esquema admitidos serán agregar y quitar una columna.If the Subscriber republishes data, the only supported schema changes are adding and dropping a column. Estos cambios deberían realizarse en el publicador mediante sp_repladdcolumn (Transact-SQL) y sp_repldropcolumn (Transact-SQL) en lugar de mediante la sintaxis ALTER TABLE DDL.These changes should be made on the Publisher using sp_repladdcolumn (Transact-SQL) and sp_repldropcolumn (Transact-SQL) rather than ALTER TABLE DDL syntax.

  • Los cambios de esquema no se replican en los suscriptores que no sean de SQL Server.Schema changes are not replicated to non-SQL Server Subscribers.

  • Los cambios de esquema no se propagan desde los publicadores que no sean de SQL ServerSQL Server .Schema changes are not propagated from non- SQL ServerSQL Server Publishers.

  • No se pueden alterar las vistas indizadas que se replican como tablas.You cannot alter indexed views that are replicated as tables. Se pueden alterar las vistas indizadas que se replican como tales, pero esto hará que se conviertan en vistas normales en lugar de vistas indizadas.Indexed views that are replicated as indexed views can be altered, but altering them will cause them to become regular views, rather than indexed views.

  • Si la publicación admite suscripciones de actualización inmediata o en cola, se debe poner el sistema en modo inactivo antes de realizar cambios de esquema: es necesario detener toda la actividad en la tabla publicada en el publicador y los suscriptores, y propagar los datos pendientes a todos los nodos.If the publication supports immediate updating or queued updating subscriptions, the system must be quiesced before making schema changes: all activity on the published table must be stopped at the Publisher and Subscribers, and pending data changes must be propagated to all nodes. Una vez propagados los cambios de esquema a todos los nodos, se puede reiniciar la actividad en las tablas publicadas.After the schema changes have propagated to all nodes, activity can resume on the published tables.

  • Si la publicación está en una topología punto a punto, se debe poner el sistema en modo inactivo antes de realizar cambios de esquema.If the publication is in a peer-to-peer topology, the system must be quiesced before making schema changes. 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).For more information, see Quiesce a Replication Topology (Replication Transact-SQL Programming).

  • La adición de una columna de marca de tiempo a una tabla y la asignación de la marca de tiempo a binary(8) hacen que se reinicialice el artículo para todas las suscripciones activas.Adding a timestamp column to a table and mapping the timestamp to binary(8) causes the article to be reinitialized for all active subscriptions.

Replicación de mezclaMerge Replication

  • El nivel de compatibilidad de las publicaciones determina la forma en que la replicación de mezcla controla los cambios de esquema y si la instantánea debe establecerse en modo nativo (valor predeterminado) o en modo de carácter:How merge replication handles schema changes is determined by the publication compatibility level, and whether the snapshot is set to native mode (default) or character mode:

    • Para replicar cambios de esquema, el nivel de compatibilidad de la publicación debe ser de al menos 90RTM.To replicate schema changes, the compatibility level of the publication must be at least 90RTM. Si los suscriptores ejecutan versiones anteriores de SQL ServerSQL 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.If Subscribers are running previous versions of SQL ServerSQL Server or the compatibility level is less than 90RTM you can use sp_repladdcolumn (Transact-SQL) and sp_repldropcolumn (Transact-SQL) to add and drop columns. No obstante, estos procedimientos están desusados.However, these procedures are deprecated.

    • Si intenta agregar a un artículo existente una columna con un tipo de datos introducido en SQL Server 2008SQL Server 2008, SQL ServerSQL Server se comportará de este modo:If you try to add to an existing article a column with a data type that was introduced in SQL Server 2008SQL Server 2008, SQL ServerSQL Server has the following behavior:

      100RTM, instantánea nativa100RTM, native snapshot 100RTM, instantánea de carácter100RTM, character snapshot Todos los demás niveles de compatibilidadAll other compatibility levels
      hierarchyidhierarchyid Permitir cambioAllow change Bloquear cambioBlock change Bloquear cambioBlock change
      geography y geometrygeography and geometry Permitir cambioAllow change Permitir cambioAllow change Bloquear cambioBlock change
      secuencia de archivofilestream Permitir cambioAllow change Bloquear cambioBlock change Bloquear cambioBlock change
      date, time, datetime2, and datetimeoffsetdate, time, datetime2, and datetimeoffset Permitir cambioAllow change Permitir cambioAllow change Bloquear cambioBlock change

      Los suscriptores de SQL Server Compact convierten estos tipos de datos en el suscriptor.SQL Server Compact Subscribers convert these data types at the Subscriber.

  • En caso de error al aplicar un cambio de esquema (por ejemplo, un error que se produce por 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 es necesario reinicializar la suscripción.If an error occurs when applying a schema change (such as an error resulting from adding a foreign key that references a table not available at the Subscriber), synchronization fails and the subscription must be reinitialized.

  • Si se realiza un cambio de esquema en una columna que forma parte de un filtro de combinación o con parámetros, es necesario reinicializar todas las suscripciones y volver a generar la instantánea.If a schema change is made on a column involved in a join filter or parameterized filter, you must reinitialize all subscriptions and regenerate the snapshot.

  • La replicación de mezcla proporciona procedimientos almacenados para omitir los cambios de esquema durante la solución de problemas.Merge replication provides stored procedures to skip schema changes during troubleshooting. Para obtener más información, vea sp_markpendingschemachange (Transact-SQL) y sp_enumeratependingschemachanges (Transact-SQL).For more information, see sp_markpendingschemachange (Transact-SQL) and sp_enumeratependingschemachanges (Transact-SQL).

Vea tambiénSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL) ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL) ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL) ALTER FUNCTION (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
Publicar datos y objetos de base de datos Publish Data and Database Objects
Volver a generar procedimientos transaccionales personalizados para reflejar cambios de esquema Regenerate Custom Transactional Procedures to Reflect Schema Changes