Compartir a través de


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.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

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.