sp_adddynamicsnapshot_job (Transact-SQL)
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 publicaciones. 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 obtener más información, vea Instantáneas para publicaciones de mezcla con filtros con parámetros.
Sintaxis
sp_adddynamicsnapshot_job [ @publication = ] 'publication'
[ , [ @suser_sname = ] 'suser_sname' ]
[ , [ @host_name = ] 'host_name' ]
[ , [ @dynamic_snapshot_jobname = ] '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=] 'publication'
Es el nombre de la publicación a la que se va a agregar el trabajo de instantáneas de datos filtrados. publication es de tipo sysname y no tiene valor predeterminado.[ @suser_sname= ] 'suser_sname'
Es el valor utilizado al crear una instantánea de datos filtrados para una suscripción que se filtra por el valor de la función SUSER_SNAME en el suscriptor. suser_sname es de tipo sysname, y no tiene ningún valor predeterminado. suser_sname debe ser NULL si esta función no se utiliza para filtrar dinámicamente la publicación.[ @host_name= ] 'host_name'
Es el valor utilizado al crear una instantánea de datos filtrados para una suscripción que se filtra por el valor de la función HOST_NAME en el suscriptor. host_name es de tipo sysname y no tiene ningún valor predeterminado. host_name debe ser NULL si esta función no se utiliza para filtrar dinámicamente la publicación.[ @dynamic_snapshot_jobname= ] 'dynamic_snapshot_jobname'
Es el nombre del trabajo de instantánea de datos filtrados creado. dynamic_snapshot_jobname es de tipo sysname y su valor predeterminado es NULL; es un parámetro OUTPUT opcional. Si se especifica, dynamic_snapshot_jobname debe tener como resultado un trabajo exclusivo en el distribuidor. Si no se especifica, se generará un nombre de trabajo automáticamente, el cual se devolverá al conjunto de resultados. Allí, el nombre se crea del siguiente modo:'dyn_' + <name of the standard snapshot job> + <GUID>
[!NOTA]
Al generar el nombre del trabajo de instantáneas dinámicas, es posible truncar el nombre del trabajo de instantáneas estándar.
[ @dynamic_snapshot_jobid= ] 'dynamic_snapshot_jobid'
Es un identificador para el trabajo de instantánea de datos filtrados creado. dynamic_snapshot_jobid es de tipo uniqueidentifier y su valor predeterminado es NULL; es un parámetro OUTPUT opcional.[ @frequency_type = ] frequency_type
Se trata de la frecuencia con que se programa el trabajo de instantáneas de datos filtrados. frequency_type es de tipo int y puede ser uno de los valores siguientes.Valor
Descripción
1
Una vez
2
A petición
4 (predeterminado)
Diariamente
8
Semanalmente
16
Mensualmente
32
Mensualmente relativa
64
Iniciar automáticamente
128
Periódica
[ @frequency_interval = ] frequency_interval
Es el período (medido en días) en que el trabajo de instantánea de datos filtrados se ejecuta. frequency_interval es de tipo int, su valor predeterminado es 1 y depende del valor de frequency_type.Valor de frequency_type
Efecto en frequency_interval
1
frequency_interval no se utiliza.
4 (predeterminado)
Cada frequency_interval días, con un valor predeterminado de "diariamente".
8
frequency_interval es uno o más de los siguientes (combinados con un operador lógico | (OR bit a bit) (Transact-SQL)):
1 = Domingo | 2 = Lunes | 4 = Martes | 8 = Miércoles | 16 = Jueves | 32 = Viernes | 64 = Sábado
16
En el día frequency_interval del mes.
32
frequency_interval es uno de los siguientes:
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 utiliza.
128
frequency_interval no se utiliza.
[ @frequency_subday=] frequency_subday
Especifica las unidades de frequency_subday_interval. frequency_subday es de tipo int y puede ser uno de estos valores.Valor
Descripción
1
Una vez
2
Segundo
4 (predeterminado)
Minuto
8
Hora
[ @frequency_subday_interval=] frequency_subday_interval
Es el número de períodos frequency_subday que han de tener lugar entre cada ejecución del trabajo. frequency_subday_interval es de tipo int y su valor predeterminado es 5.[ @frequency_relative_interval=] frequency_relative_interval
Es la repetición del trabajo de instantáneas de datos filtrados en cada mes. Este parámetro se utiliza cuando frequency_type está definido como 32 (mensualmente relativa). frequency_relative_interval es de tipo int y puede tener uno de estos valores.Valor
Descripción
1 (predeterminado)
Primero
2
Segundo
4
Tercero
8
Cuarto
16
Último
[ @frequency_recurrence_factor=] frequency_recurrence_factor
Es el factor de periodicidad utilizado por frequency_type. frequency_recurrence_factor es de tipo int y su valor predeterminado es 0.[ @active_start_date=] active_start_date
Es la fecha en la que comienza el trabajo de instantáneas de datos filtrados, en formato AAAAMMDD. active_start_date es de tipo int y su valor predeterminado es NULL.[ @active_end_date=] active_end_date
Es la fecha en la que finaliza el trabajo de instantáneas de datos filtrados, en formato AAAAMMDD. active_end_date es de tipo int y su valor predeterminado es NULL.[ @active_start_time_of_day=] active_start_time_of_day
Es la hora del día a la que comienza el trabajo de instantáneas de datos filtrados, en formato HHMMSS. active_start_time_of_day es de tipo int y su valor predeterminado es NULL.[ @active_end_time_of_day=] active_end_time_of_day
Es la hora del día a la que finaliza el trabajo de instantáneas de datos filtrados, en formato HHMMSS. active_end_time_of_day es de tipo int y su valor predeterminado es NULL.
Conjunto de resultados
Nombre de la columna |
Tipo de datos |
Descripción |
---|---|---|
id |
int |
Identifica el trabajo de instantánea de datos filtrados 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 del Agente MicrosoftSQL Server en el distribuidor. |
Valores de código de retorno
0 (correcto) o 1 (error)
Notas
sp_adddynamicsnapshot_job se utiliza en la replicación de mezcla para publicaciones que utilizan un filtro con parámetros.
Ejemplo
-- 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'AdventureWorks';
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 [AdventureWorks];
-- Enable AdventureWorks 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 AdventureWorks.',
@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].[EmployeeID] = [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
Sólo los miembros de la función fija de servidor sysadmin o de la función fija de base de datos db_owner pueden ejecutar sp_adddynamicsnapshot_job.