sp_adddynamicsnapshot_job (Transact-SQL)
Se aplica a: SQL Server Azure 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.
Valor | 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) operador lógico):1 = Domingo2 = Lunes4 = Martes8 = miércoles16 = Jueves32 = Viernes64 = Sábado |
16 |
En el @frequency_interval día del mes. |
32 |
@frequency_interval es una de las siguientes opciones:1 = Domingo2 = Lunes3 = Martes4 = miércoles5 = Jueves6 = Viernes7 = Sábado8 = Día9 = Día de la semana10 = 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.
Valor | 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.
Valor | 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 yyyyMMdd
el 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
.