Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Managed Instance
De manera predeterminada, la replicación transaccional lleva a cabo todos los cambios de datos en los suscriptores a través de procedimientos almacenados generados por procedimientos internos para cada artículo de la tabla en la publicación. Los tres procedimientos (para inserciones, actualizaciones y eliminaciones, respectivamente) se copian al suscriptor y se ejecutan cuando se replica una inserción, actualización o eliminación en el suscriptor.
Cuando se realiza un cambio de esquema en una tabla en un publicador de SQL Server, la replicación vuelve a generar estos procedimientos automáticamente llamando al mismo conjunto de procedimientos de scripting internos para que los nuevos procedimientos coincidan con el nuevo esquema (no se admite la replicación de cambios de esquema para publicadores de Oracle).
También puede especificar procedimientos personalizados para reemplazar uno o varios de los procedimientos predeterminados. Los procedimientos personalizados deben cambiarse si el cambio de esquema afecta al procedimiento. Por ejemplo, si un procedimiento hace referencia a una columna que se quita en un cambio de esquema, se deben quitar del procedimiento las referencias a esa columna.
La replicación propaga un nuevo procedimiento personalizado a los suscriptores de dos maneras:
- Utilice un procedimiento de scripting personalizado para reemplazar los valores predeterminados que utiliza la replicación.
- Usar un script que contenga una nueva definición de procedimiento personalizado
Utilice un procedimiento de scripting personalizado para reemplazar los valores predeterminados que utiliza la replicación.
Al ejecutar sp_addarticle, asegúrese de que el bit @schema_option0x02
está configurado en true
.
Nota:
La definición del procedimiento almacenado personalizado debe ser escrita mediante Transact-SQL dinámico, dentro de un procedimiento almacenado encapsulador. Este procedimiento almacenado de contenedor también debe incluir un parámetro @artid de tipo int para asegurarse de que se crea en el Suscriptor.
Ejecute sp_register_custom_scripting y especifique un valor de insert
, update
o delete
para el parámetro @type y el nombre del procedimiento de scripting personalizado para el parámetro @value .
La siguiente vez que se lleve a cabo un cambio de esquema, la replicación llamará a este procedimiento almacenado para crear un script de la definición para el nuevo procedimiento almacenado personalizado definido por el usuario y, después, propagará el procedimiento a cada suscriptor.
Ejemplo
En este ejemplo, supongamos que el publicador y el suscriptor ya están configurados y desea crear un procedimiento almacenado personalizado delete
.
En el Suscriptor, cree una tabla para mostrar el script de eliminación personalizado.
USE [SubscriberDB]; GO CREATE TABLE DeleteLogging (id INT PRIMARY KEY); GO
Agregue el artículo del editor. Tenga en cuenta los valores de los parámetros
@schema_option
,@ins_cmd
,@upd_cmd
y@del_cmd
.USE [PublisherDB]; EXECUTE sp_addarticle @publication = N'PubName1', @article = N'Purchases', @source_owner = N'dbo', @source_object = N'Purchases', @type = N'logbased', @description = NULL, @creation_script = NULL, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_table = N'Purchases', @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL sp_MSins_dboPurchases', -- default @del_cmd = N'CALL custom_delete', -- custom @upd_cmd = N'SCALL sp_MSupd_dboPurchases'; -- default GO
Cree un procedimiento almacenado que genere el script del procedimiento almacenado
custom_delete
que desea usar en el Suscriptor. Este es el procedimiento almacenado de contenedor, como se indicó anteriormente.Devolver valores distintos de cero de este procedimiento almacenado dará como resultado que
custom_delete
no se cree en el Suscriptor.SELECT
debe devolver la definición completaCREATE
del procedimiento almacenado que se usará en el Suscriptor.Considere el uso del parámetro requerido
@artid
.USE [PublisherDB]; GO CREATE OR ALTER PROCEDURE script_custom_delete (@artid INT) AS BEGIN SELECT 'CREATE OR ALTER PROCEDURE custom_delete @pkc1 INT AS BEGIN INSERT INTO DeleteLogging (id) VALUES (@pkc1) END'; RETURN 0; END GO
Registre el script personalizado en el Publicador.
USE [PublisherDB]; GO EXECUTE sp_register_custom_scripting @type = 'delete', @value = 'script_custom_delete', @publication = 'PubName1', @article = 'Purchases'; GO
Agregue una suscripción. En este ejemplo, el parámetro
@sync_type
se establece enreplication support only
, por lo que no se utiliza ninguna copia instantánea.USE [PublisherDB]; GO EXECUTE sp_addsubscription @publication = N'PubName1', @subscriber = @@SERVERNAME, @destination_db = N'SubscriberDB', @subscription_type = N'Push', @sync_type = N'replication support only', @article = N'all', @update_mode = N'read only', @subscriber_type = 0; GO
Usar un script que contenga una nueva definición de procedimiento personalizado
Al ejecutar sp_addarticle, establezca el bit de @schema_option0x02
en false
para que la replicación no genere automáticamente procedimientos personalizados en el suscriptor.
Antes de cada cambio de esquema, cree un nuevo archivo de script y registre el script con replicación ejecutando sp_register_custom_scripting. Especifique un valor de custom_script
para el parámetro @type y la ruta de acceso al script en el publicador para el parámetro @value .
La siguiente vez que realice un cambio de esquema importante, este script se ejecutará en cada suscriptor en la misma transacción que el comando DDL. Una vez realizado el cambio de esquema, el script se elimina del registro. Debe volver a registrar el script para que se ejecute después de un cambio de esquema posterior.