sp_adddynamicsnapshot_job (Transact-SQL)

S’applique à :SQL ServerAzure SQL Managed Instance

Crée un travail de l'Agent qui crée l'instantané de données filtrées pour une publication avec des filtres de lignes paramétrables. Cette procédure stockée est exécutée sur le serveur de publication dans la base de données de publication. Un administrateur utilise cette procédure stockée pour créer manuellement des travaux d'instantané de données filtrées pour des Abonnés.

Remarque

Pour créer un travail d'instantané de données filtrées, un travail d'instantané standard doit déjà exister pour la publication.

Pour plus d'informations, voir Créer un instantané d’une publication de fusion avec des filtres paramétrés.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

[ @publication = ] N’publication'

Nom de la publication à laquelle les données filtrées instantané travail sont ajoutées. @publication est sysname, sans valeur par défaut.

[ @suser_sname = ] N’suser_sname'

Valeur utilisée lors de la création d’une instantané de données filtrées pour un abonnement filtré par la valeur de la fonction SUSER_SNAME sur l’Abonné. @suser_sname est sysname, avec la valeur par défaut NULL. @suser_sname doit être NULL si cette fonction n’est pas utilisée pour filtrer dynamiquement la composition.

[ @host_name = ] N’host_name'

Valeur utilisée lors de la création d’une instantané de données filtrées pour un abonnement filtré par la valeur de la fonction HOST_NAME sur l’Abonné. @host_name est sysname, avec la valeur par défaut NULL. host_name doit être NULL si cette fonction n’est pas utilisée pour filtrer dynamiquement la composition.

[ @dynamic_snapshot_jobname = ] SORTIE N’dynamic_instantané_jobname'

Nom des données filtrées instantané travail créé. @dynamic_instantané_jobname est un paramètre OUTPUT de type sysname. Si elle est spécifiée, @dynamic_instantané_jobname doit être résolue en un travail unique sur le serveur de distribution. S’il n’est pas spécifié, un nom de travail est généré automatiquement dans le jeu de résultats, où le nom est créé comme suit :

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

Remarque

Lors de la génération du nom du travail de instantané dynamique, vous pouvez tronquer le nom du travail instantané standard.

[ @dynamic_snapshot_jobid = ] SORTIE 'dynamic_instantané_jobid'

Identificateur des données filtrées instantané tâche créée. @dynamic_instantané_jobid est un paramètre OUTPUT de type uniqueidentifier, avec une valeur par défaut NULL.

[ @frequency_type = ] frequency_type

Spécifie la fréquence à laquelle les données filtrées instantané travail sont planifiées. @frequency_type est int et peut être l’une de ces valeurs.

Valeur Description
1 Ponctuelle
2 (par défaut) À la demande
4 Quotidiennement
8 Hebdomadaire
16 Mensuelle
32 Mensuelle relative
64 Autostart
128 Récurrent

[ @frequency_interval = ] frequency_interval

Période, mesurée en jours, lorsque les données filtrées instantané travail sont exécutées. @frequency_interval est int, et dépend de la valeur de @frequency_type.

Valeur de @frequency_type Effet sur @frequency_interval
1 (par défaut) @frequency_interval n’est pas utilisé.
4 Tous les @frequency_interval jours.
8 @frequency_interval est un ou plusieurs des éléments suivants (combinés à un | (OR au niveau du bit) (Transact-SQL) opérateur logique) :

1 = Dimanche
2 = Lundi
4 = Mardi
8 = Mercredi
16 = jeudi
32 = vendredi
64 = Samedi
16 Le @frequency_interval jour du mois.
32 @frequency_interval est l’une des options suivantes :

1 = Dimanche
2 = Lundi
3 = Mardi
4 = Mercredi
5 = jeudi
6 = vendredi
7 = Samedi
8 = Jour
9 = Jour de la semaine
10 = Jour du week-end
64 @frequency_interval n’est pas utilisé.
128 @frequency_interval n’est pas utilisé.

[ @frequency_subday = ] frequency_subday

Spécifie les unités de @frequency_subday_interval. @frequency_subday est int et peut être l’une de ces valeurs.

Valeur Description
1 (par défaut) Une fois
2 Second
4 Minute
8 Hour

[ @frequency_subday_interval = ] frequency_subday_interval

Nombre de périodes frequency_subday qui se produisent entre chaque exécution du travail. @frequency_subday_interval est int, avec la valeur par défaut 1.

[ @frequency_relative_interval = ] frequency_relative_interval

L’occurrence des données filtrées instantané travail chaque mois. Ce paramètre est utilisé lorsque @frequency_type est défini 32 sur (relatif mensuel). @frequency_relative_interval est int et peut être l’une de ces valeurs.

Valeur Description
1 (par défaut) First
2 Second
4 Third
8 Quatrième
16 Dernier

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

Facteur de périodicité utilisé par frequency_type. @frequency_recurrence_factor est int, avec la valeur par défaut 1.

[ @active_start_date = ] active_start_date

Date à laquelle les données filtrées instantané travail sont d’abord planifiées, mises en forme comme yyyyMMdd. @active_start_date est int, avec une valeur par défaut de 0.

[ @active_end_date = ] active_end_date

Date à laquelle les données filtrées instantané travail cesse d’être planifiées, mises en forme comme yyyyMMdd. @active_end_date est int, avec une valeur par défaut de 0.

[ @active_start_time_of_day = ] active_start_time_of_day

Heure du jour où les données filtrées instantané travail sont planifiées pour la première fois, mises en forme comme HHmmss. @active_start_time_of_day est int, avec la valeur par défaut 0.

[ @active_end_time_of_day = ] active_end_time_of_day

Heure du jour où les données filtrées instantané travail cesse d’être planifiées, mises en forme comme HHmmss. @active_end_time_of_day est int, avec la valeur par défaut 0.

Jeu de résultats

Nom de la colonne Type de données Description
id int Identifie le travail de instantané de données filtrées dans la table système MSdynamic instantané jobs.
dynamic_snapshot_jobname sysname Nom du travail d'instantané de données filtrées.
dynamic_snapshot_jobid uniqueidentifier Identifie de manière unique le travail SQL Server Agent sur le serveur de distribution.

Valeurs des codes de retour

0 (réussite) ou 1 (échec).

Notes

sp_adddynamicsnapshot_job est utilisé dans la réplication de fusion pour les publications qui utilisent un filtre paramétrable.

Exemples

-- 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

Autorisations

Seuls les membres du rôle serveur fixe sysadmin ou le rôle de base de données fixe db_owner peuvent s’exécuter sp_adddynamicsnapshot_job.