sp_adddynamicsnapshot_job (Transact-SQL)

Cria um trabalho de agente que gera um instantâneo de dados filtrado para uma publicação com filtros de linha com parâmetros. Esse procedimento armazenado é executado no Publicador, no banco de dados de publicação. Esse procedimento armazenado é usado por um administrador para criar trabalhos de instantâneo de dados manualmente filtrados para Assinantes.

ObservaçãoObservação

Para que um trabalho de instantâneo de dados filtrados seja criado, um trabalho de instantâneo padrão para a publicação deve existir.

Para obter mais informações, consulte Instantâneos para publicações de mesclagem com filtros com parâmetros.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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'
    É o nome da publicação para o qual o trabalho de instantâneo de dados filtrado está sendo adicionado. publication é sysname, sem padrão.

  • [ @suser_sname= ] 'suser_sname'
    É o valor usado ao criar um instantâneo de dados filtrado para uma assinatura filtrada pelo valor da função SUSER_SNAME no Assinante. suser_sname é sysname, sem padrão. suser_sname deve ser NULL se essa função não for usada para filtrar dinamicamente a publicação.

  • [ @host_name= ] 'host_name'
    É o valor usado ao criar um instantâneo de dados filtrado para uma assinatura filtrada pelo valor da função HOST_NAME no Assinante. suser_sname é sysname, sem padrão. host_name deve ser NULL se essa função não for usada para filtrar dinamicamente a publicação.

  • [ @dynamic_snapshot_jobname= ] 'dynamic_snapshot_jobname'
    É o nome do trabalho de instantâneo de dados filtrado criado. dynamic_snapshot_jobname é sysname, com um padrão de NULL, e é um parâmetro OUTPUT opcional. Se especificado, dynamic_snapshot_jobname deve resolver para um trabalho único no Distribuidor. Se não for especificado, um nome de trabalho será automaticamente gerado e retornado no conjunto de resultados, onde o nome será criado como segue:

    'dyn_' + <name of the standard snapshot job> + <GUID>
    
    ObservaçãoObservação

    Ao gerar o nome do trabalho de instantâneo dinâmico, você pode truncar o nome do trabalho de instantâneo padrão.

  • [ @dynamic_snapshot_jobid= ] 'dynamic_snapshot_jobid'
    É um identificador para o trabalho de instantâneo de dados filtrado criado. dynamic_snapshot_jobname é sysname, com um padrão de NULL, e é um parâmetro OUTPUT opcional.

  • [ @frequency_type=] frequency_type
    É a freqüência de agendamento do trabalho de instantâneo de dados filtrado. frequency_type é int e pode ser um destes valores.

    Valor

    Descrição

    1

    Uma vez

    2

    Sob demanda

    4 (padrão)

    Diariamente

    8

    Semanalmente

    16

    Mensalmente

    32

    Relativo ao mês

    64

    Iniciar automaticamente

    128

    Recorrente

  • [ @frequency_interval = ] frequency_interval
    É o período (medido em dias) quando o trabalho de instantâneo de dados filtrado é executado. frequency_interval é int, com um valor padrão de 1 e depende do valor de frequency_type.

    Valor de frequency_type

    Efeito em frequency_interval

    1

    frequency_interval não é usado.

    4(padrão)

    Cada dia de frequency_interval, com um padrão diário.

    8

    frequency_interval é um ou mais dos seguintes (combinado com um operador lógico | (OR bit a bit) (Transact-SQL)):

    1 = Domingo | 2 = Segunda-feira | 4 = Terça-feira | 8 = Quarta-feira | 16 = Quinta-feira | 32 = Sexta-feira | 64 = Sábado

    16

    No dia do freq_interval do mês.

    32

    frequency_interval é um dos seguintes:

    1 = Domingo | 2 = Segunda-feira | 3 = Terça-feira | 4 = Quarta-feira | 5 = Quinta-feira | 6 = Sexta-feira | 7 = Sábado | 8 = Dia | 9 = Dia da semana | 10 = Dia do fim de semana

    64

    frequency_interval não é usado.

    128

    frequency_interval não é usado.

  • [ @frequency_subday=] frequency_subday
    Especifica as unidades para frequency_subday_interval. frequency_subday é int e pode ser um destes valores.

    Valor

    Descrição

    1

    Uma vez

    2

    Segundo

    4 (padrão)

    Minuto

    8

    Hora

  • [ @frequency_subday_interval=] frequency_subday_interval
    É o número de períodos de frequency_subday que ocorre entre cada execução do trabalho. frequency_subday_interval é int, com um padrão de 5.

  • [ @frequency_relative_interval=] frequency_relative_interval
    É a ocorrência do trabalho de instantâneo de dados filtrado em cada mês. É o parâmetro usado quando frequency_type é definido como 32 (relativo ao mês). frequency_relative_interval é int e pode ser um destes valores.

    Valor

    Descrição

    1(padrão)

    Primeiro

    2

    Segundo

    4

    Terceiro

    8

    Quarto

    16

    Último

  • [ @ frequency_recurrence_factor =] frequency_recurrence_factor
    É o fator de recorrência usado por frequency_type. frequency_recurrence_factor é int, com um padrão de 0.

  • [ @active_start_date=] active_start_date
    É a data do primeiro agendamento do trabalho de instantâneo de dados filtrado, formatada como YYYYMMDD. active_start_date é int, com um padrão de NULL.

  • [ @active_end_date=] active_end_date
    É a data em que o trabalho de instantâneo de dados filtrado deixa de ser agendado, formatada como YYYYMMDD. active_end_date é int, com um padrão de NULL.

  • [ @active_start_time_of_day=] active_start_time_of_day
    É a hora do dia do primeiro agendamento do trabalho de instantâneo de dados filtrado, formatada como HHMMSS. active_start_time_of_day é int, com um padrão de NULL.

  • [ @active_end_time_of_day=] active_end_time_of_day
    É a hora do dia em que o trabalho de instantâneo de dados filtrado deixa de ser agendado, formatada como HHMMSS. active_end_time_of_day é int, com um padrão de NULL.

Conjunto de resultados

Nome da coluna

Tipo de dados

Descrição

id

int

Identifica o trabalho de instantâneo de dados filtrado na tabela do sistema MSdynamicsnapshotjobs.

dynamic_snapshot_jobname

sysname

Nome do trabalho de instantâneo de dados filtrado.

dynamic_snapshot_jobid

uniqueidentifier

Identifica com exclusividade o Microsoft SQL Server Agent no Distribuidor.

Valores de código de retorno

0 (êxito) ou 1 (falha)

Comentários

sp_adddynamicsnapshot_job é usado em replicação de mesclagem para publicações que usam um filtro com parâmetros.

Exemplo

-- 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'AdventureWorks2008R2';
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 [AdventureWorks2008R2];

-- Enable AdventureWorks2008R2 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 AdventureWorks2008R2.', 
  @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

Permissões

Somente membros da função de servidor fixa sysadmin ou da função de banco de dados fixa db_owner podem executar sp_adddynamicsnapshot_job.