Partager via


sp_adddynamicsnapshot_job (Transact-SQL)

S’applique à : SQL Server Azure 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 le travail d’instantané de données filtré est ajouté. @publication est sysname, sans valeur par défaut.

[ @suser_sname = ] N’suser_sname'

Valeur utilisée lors de la création d’un instantané de données filtré pour un abonnement filtré, filtrée 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’un instantané de données filtré pour un abonnement filtré, filtrée 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_snapshot_jobname'

Nom du travail d’instantané de données filtré créé. @dynamic_snapshot_jobname est un paramètre OUTPUT de type sysname. Si elle est spécifiée, @dynamic_snapshot_jobname devez résoudre 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

Lorsque vous générez le nom du travail d’instantané dynamique, vous pouvez tronquer le nom du travail d’instantané standard.

[ @dynamic_snapshot_jobid = ] SORTIE 'dynamic_snapshot_jobid'

Identificateur du travail d’instantané de données filtré créé. @dynamic_snapshot_jobid est un paramètre OUTPUT de type uniqueidentifier, avec la valeur par défaut NULL.

[ @frequency_type = ] frequency_type

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

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

[ @frequency_interval = ] frequency_interval

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

Valeur de @frequency_type Effet sur @frequency_interval
1 (valeur 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 (valeur par défaut) Une fois
2 Second
4 Minute
8 Heure

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

Occurrence du travail d’instantané de données filtré dans 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 (valeur par défaut) First
2 Second
4 Third
8 Quatrième
16 Dernière

[ @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 la tâche d’instantané de données filtrée est planifiée pour la première fois, mise 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 la tâche d’instantané de données filtrée cesse d’être planifiée, mise 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ù le travail d’instantané de données filtré est planifié pour la première fois, mis 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ù la tâche d’instantané de données filtrée cesse d’être planifiée, mise 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 d’instantané de données filtré dans la table système MSdynamicsnapshotjobs .
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.