sp_adddynamicsnapshot_job (Transact-SQL)

Se aplica a:SQL ServerAzure SQL Managed Instance

Crea un trabajo de agente que genera una instantánea de datos filtrados para una publicación con filtros de fila con parámetros. Este procedimiento almacenado se ejecuta en el publicador de la base de datos de publicación. Lo utiliza el administrador para crear manualmente trabajos de instantáneas de datos filtrados para los suscriptores.

Nota:

Para crear un trabajo de instantáneas de datos filtrados, antes debe existir un trabajo de instantáneas estándar para la publicación.

Para más información, consulte Crear una instantánea para una publicación de mezcla con filtros con parámetros.

Convenciones de sintaxis de Transact-SQL

Sintaxis

sp_adddynamicsnapshot_job
    [ @publication = ] N'publication'
    [ , [ @suser_sname = ] N'suser_sname' ]
    [ , [ @host_name = ] N'host_name' ]
    [ , [ @dynamic_snapshot_jobname = ] N'dynamic_snapshot_jobname' OUTPUT ]
    [ , [ @dynamic_snapshot_jobid = ] 'dynamic_snapshot_jobid' OUTPUT ]
    [ , [ @frequency_type = ] frequency_type ]
    [ , [ @frequency_interval = ] frequency_interval ]
    [ , [ @frequency_subday = ] frequency_subday ]
    [ , [ @frequency_subday_interval = ] frequency_subday_interval ]
    [ , [ @frequency_relative_interval = ] frequency_relative_interval ]
    [ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
    [ , [ @active_start_date = ] active_start_date ]
    [ , [ @active_end_date = ] active_end_date ]
    [ , [ @active_start_time_of_day = ] active_start_time_of_day ]
    [ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ ; ]

Argumentos

[ @publication = ] N'publication'

Nombre de la publicación a la que se agrega el trabajo de instantánea de datos filtrado. @publication es sysname, sin ningún valor predeterminado.

[ @suser_sname = ] N'suser_sname'

Valor utilizado al crear una instantánea de datos filtrada para una suscripción filtrada por el valor de la función SUSER_SNAME en el suscriptor. @suser_sname es sysname, con un valor predeterminado de NULL. @suser_sname debe ser NULL si esta función no se usa para filtrar dinámicamente la publicación.

[ @host_name = ] N'host_name'

Valor utilizado al crear una instantánea de datos filtrada para una suscripción filtrada por el valor de la función HOST_NAME en el suscriptor. @host_name es sysname, con un valor predeterminado de NULL. host_name debe ser NULL si esta función no se usa para filtrar dinámicamente la publicación.

[ @dynamic_snapshot_jobname = ] SALIDA de N'dynamic_snapshot_jobname'

Nombre del trabajo de instantánea de datos filtrado creado. @dynamic_snapshot_jobname es un parámetro OUTPUT de tipo sysname. Si se especifica, @dynamic_snapshot_jobname debe resolverse en un trabajo único en el distribuidor. Si no se especifica, se genera automáticamente un nombre de trabajo en el conjunto de resultados, donde se crea el nombre de la siguiente manera:

'dyn_' + <name of the standard snapshot job> + <GUID>

Nota:

Al generar el nombre del trabajo de instantánea dinámica, puede truncar el nombre del trabajo de instantánea estándar.

[ @dynamic_snapshot_jobid = ] SALIDA 'dynamic_snapshot_jobid'

Identificador del trabajo de instantánea de datos filtrado creado. @dynamic_snapshot_jobid es un parámetro OUTPUT de tipo uniqueidentifier, con un valor predeterminado de NULL.

[ @frequency_type = ] frequency_type

Especifica la frecuencia con la que se programa el trabajo de instantánea de datos filtrado. @frequency_type es int y puede ser uno de estos valores.

Value Descripción
1 Una vez
2 (valor predeterminado) A petición
4 Diario
8 Semanal
16 Mensual
32 Mensualmente relativa
64 Iniciar automáticamente
128 Periódico

[ @frequency_interval = ] frequency_interval

El período, medido en días, cuando se ejecuta el trabajo de instantánea de datos filtrado. @frequency_interval es int y depende del valor de @frequency_type.

Valor de @frequency_type Efecto en @frequency_interval
1 (valor predeterminado) @frequency_interval no se usa.
4 Cada @frequency_interval días.
8 @frequency_interval es una o varias de las siguientes (combinadas con | (OR bit a bit) (Transact-SQL) operador lógico):

1 = Domingo
2 = Lunes
4 = Martes
8 = miércoles
16 = Jueves
32 = Viernes
64 = Sábado
16 En el @frequency_interval día del mes.
32 @frequency_interval es una de las siguientes opciones:

1 = Domingo
2 = Lunes
3 = Martes
4 = miércoles
5 = Jueves
6 = Viernes
7 = Sábado
8 = Día
9 = Día de la semana
10 = Día del fin de semana
64 @frequency_interval no se usa.
128 @frequency_interval no se usa.

[ @frequency_subday = ] frequency_subday

Especifica las unidades de @frequency_subday_interval. @frequency_subday es int y puede ser uno de estos valores.

Value Descripción
1 (valor predeterminado) Una vez
2 Second
4 Minute
8 Hora

[ @frequency_subday_interval = ] frequency_subday_interval

Número de frequency_subday períodos que se producen entre cada ejecución del trabajo. @frequency_subday_interval es int, con un valor predeterminado de 1.

[ @frequency_relative_interval = ] frequency_relative_interval

La aparición del trabajo de instantánea de datos filtrado en cada mes. Este parámetro se usa cuando @frequency_type se establece 32 en (relativo mensual). @frequency_relative_interval es int y puede ser uno de estos valores.

Value Descripción
1 (valor predeterminado) Primero
2 Segundo
4 Tercero
8 Cuarta
16 Último

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

Factor de periodicidad utilizado por frequency_type. @frequency_recurrence_factor es int, con un valor predeterminado de 1.

[ @active_start_date = ] active_start_date

Fecha en que el trabajo de instantánea de datos filtrado se programa por primera vez, con yyyyMMddel formato . @active_start_date es int, con un valor predeterminado de 0.

[ @active_end_date = ] active_end_date

Fecha en la que el trabajo de instantánea de datos filtrado deja de programarse, con el formato yyyyMMdd. @active_end_date es int, con un valor predeterminado de 0.

[ @active_start_time_of_day = ] active_start_time_of_day

La hora del día en que el trabajo de instantánea de datos filtrado se programa por primera vez, con el formato HHmmss. @active_start_time_of_day es int, con un valor predeterminado de 0.

[ @active_end_time_of_day = ] active_end_time_of_day

Hora del día en que el trabajo de instantánea de datos filtrado deja de estar programado, con el formato HHmmss. @active_end_time_of_day es int, con un valor predeterminado de 0.

Conjunto de resultados

Nombre de la columna Tipo de datos Descripción
id int Identifica el trabajo de instantánea de datos filtrado en la tabla del sistema MSdynamicsnapshotjobs .
dynamic_snapshot_jobname sysname Nombre del trabajo de instantáneas de datos filtrados.
dynamic_snapshot_jobid uniqueidentifier Identifica de forma única el trabajo de Agente SQL Server en el distribuidor.

Valores de código de retorno

0 (correcto) o 1 (erróneo).

Comentarios

sp_adddynamicsnapshot_job se usa en la replicación de mezcla para publicaciones que usan un filtro con parámetros.

Ejemplos

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- Create a new snapshot job for the publication, using the 
-- default schedule. Pass credentials at runtime using 
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(Login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains customer information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

PRINT '*** Waiting for the initial snapshot.';
GO

-- Create a temporary table to store the filtered data snapshot 
-- job information.
CREATE TABLE #temp (id int,
    job_name sysname,
    job_id uniqueidentifier,
    dynamic_filter_login sysname NULL,
    dynamic_filter_hostname sysname NULL,
    dynamic_snapshot_location nvarchar(255),
    frequency_type int, 
    frequency_interval int, 
    frequency_subday_type int,
    frequency_subday_interval int, 
    frequency_relative_interval int, 
    frequency_recurrence_factor int, 
    active_start_date int, 
    active_end_date int, 
    active_start_time int, 
    active_end_time int
)

-- Create each snapshot for a partition 
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';

WHILE NOT EXISTS(SELECT * FROM sysmergepublications 
    WHERE [name] = @publication 
    AND snapshot_ready = 1)
BEGIN
    WAITFOR DELAY '00:00:05'
END

-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition 
  @publication = @publication,
  @host_name = @hostname;

-- Create the filtered data snapshot job, and use the returned 
-- information to start the job.
EXEC sp_adddynamicsnapshot_job 
  @publication = @publication,
  @host_name = @hostname;

INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
    dynamic_filter_hostname, dynamic_snapshot_location,
    frequency_type,	frequency_interval, frequency_subday_type,
    frequency_subday_interval, frequency_relative_interval, 
    frequency_recurrence_factor, active_start_date,	active_end_date, 
    active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;

SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);

EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO

Permisos

Solo los miembros del rol fijo de servidor sysadmin o el rol fijo de base de datos db_owner pueden ejecutar sp_adddynamicsnapshot_job.