Condividi tramite


sp_adddynamicsnapshot_job (Transact-SQL)

Si applica a: SQL Server Istanza gestita di SQL di Azure

Crea un processo di agente che genera uno snapshot dei dati filtrati per una pubblicazione con filtri di riga con parametri. Questa stored procedure viene eseguita nel database di pubblicazione del server di pubblicazione. Questa stored procedure viene utilizzata da un amministratore per creare in modo manuale processi di snapshot dei dati filtrati per Sottoscrittori.

Nota

Affinché venga creato un processo di snapshot dei dati filtrati, è necessario che esista già un processo di snapshot standard per la pubblicazione.

Per altre informazioni, vedere Creazione di uno snapshot per una pubblicazione di tipo merge con filtri con parametri.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

[ @publication = ] N'publication'

Nome della pubblicazione a cui viene aggiunto il processo di snapshot dei dati filtrati. @publication è sysname, senza impostazione predefinita.

[ @suser_sname = ] N'suser_sname'

Valore utilizzato durante la creazione di uno snapshot dei dati filtrato per una sottoscrizione filtrata in base al valore della funzione SUSER_SNAME nel Sottoscrittore. @suser_sname è sysname, con un valore predefinito .NULL @suser_sname deve essere NULL se questa funzione non viene usata per filtrare dinamicamente la pubblicazione.

[ @host_name = ] N'host_name'

Valore utilizzato durante la creazione di uno snapshot dei dati filtrato per una sottoscrizione filtrata filtrata in base al valore della funzione HOST_NAME nel Sottoscrittore. @host_name è sysname, con un valore predefinito .NULL host_name deve essere NULL se questa funzione non viene usata per filtrare dinamicamente la pubblicazione.

[ @dynamic_snapshot_jobname = ] N'dynamic_snapshot_jobname' OUTPUT

Nome del processo di snapshot dei dati filtrato creato. @dynamic_snapshot_jobname è un parametro OUTPUT di tipo sysname. Se specificato, @dynamic_snapshot_jobname deve essere risolto in un processo univoco nel server di distribuzione. Se non specificato, viene generato automaticamente un nome di processo nel set di risultati, in cui viene creato il nome come indicato di seguito:

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

Nota

Quando si genera il nome del processo snapshot dinamico, è possibile troncare il nome del processo di snapshot standard.

[ @dynamic_snapshot_jobid = ] OUTPUT 'dynamic_snapshot_jobid'

Identificatore per il processo di snapshot dei dati filtrato creato. @dynamic_snapshot_jobid è un parametro OUTPUT di tipo uniqueidentifier, con un valore predefinito .NULL

[ @frequency_type = ] frequency_type

Specifica la frequenza in base alla quale è pianificato il processo di snapshot dei dati filtrati. @frequency_type è int e può essere uno di questi valori.

valore Descrizione
1 Singola occorrenza
2 (predefinito) Su richiesta
4 Ogni giorno
8 Settimanale
16 Mensile
32 Mensile relativa
64 Avvio automatico
128 Ricorrente

[ @frequency_interval = ] frequency_interval

Periodo, misurato in giorni, quando viene eseguito il processo di snapshot dei dati filtrati. @frequency_interval è int e dipende dal valore di @frequency_type.

Valore di @frequency_type Effetto sulle @frequency_interval
1 (predefinito) @frequency_interval non è usato.
4 Ogni @frequency_interval giorni.
8 @frequency_interval è uno o più dei seguenti elementi (combinati con un oggetto | (OR bit per bit) Operatore logico):

1 = Domenica
2 = Lunedì
4 = Martedì
8 = Mercoledì
16 = Giovedì
32 = Venerdì
64 = Sabato
16 Nel @frequency_interval giorno del mese.
32 @frequency_interval è una delle opzioni seguenti:

1 = Domenica
2 = Lunedì
3 = Martedì
4 = Mercoledì
5 = Giovedì
6 = Venerdì
7 = Sabato
8 = Giorno
9 = Giorno feriale
10 = Giorno del fine settimana
64 @frequency_interval non è usato.
128 @frequency_interval non è usato.

[ @frequency_subday = ] frequency_subday

Specifica le unità per @frequency_subday_interval. @frequency_subday è int e può essere uno di questi valori.

valore Descrizione
1 (predefinito) Una sola volta
2 Secondo
4 Minute
8 Ore

[ @frequency_subday_interval = ] frequency_subday_interval

Numero di periodi di frequency_subday che si verificano tra ogni esecuzione del processo. @frequency_subday_interval è int, con il valore predefinito 1.

[ @frequency_relative_interval = ] frequency_relative_interval

Occorrenza del processo di snapshot dei dati filtrato in ogni mese. Questo parametro viene usato quando @frequency_type è impostato su 32 (relativo mensile). @frequency_relative_interval è int e può essere uno di questi valori.

valore Descrizione
1 (predefinito) First
2 Secondo
4 Terza
8 Quarta
16 Ultimo

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

Fattore di ricorrenza utilizzato da frequency_type. @frequency_recurrence_factor è int, con un valore predefinito .1

[ @active_start_date = ] active_start_date

Data della prima pianificazione del processo di snapshot dei dati filtrati, formattata come yyyyMMdd. @active_start_date è int, con un valore predefinito .0

[ @active_end_date = ] active_end_date

Data in cui il processo di snapshot dei dati filtrati smette di essere pianificato, formattato come yyyyMMdd. @active_end_date è int, con un valore predefinito .0

[ @active_start_time_of_day = ] active_start_time_of_day

Ora del giorno in cui il processo di snapshot dei dati filtrati viene pianificato per la prima volta, formattato come HHmmss. @active_start_time_of_day è int, con il valore predefinito 0.

[ @active_end_time_of_day = ] active_end_time_of_day

Ora del giorno in cui il processo di snapshot dei dati filtrati smette di essere pianificato, formattato come HHmmss. @active_end_time_of_day è int, con il valore predefinito .0

Set di risultati

Nome colonna Tipo di dati Descrizione
id int Identifica il processo di snapshot dei dati filtrati nella tabella di sistema MSdynamicsnapshotjobs .
dynamic_snapshot_jobname sysname Nome del processo di snapshot dei dati filtrati.
dynamic_snapshot_jobid uniqueidentifier Identifica in modo univoco il processo di SQL Server Agent nel server di distribuzione.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

Osservazioni:

sp_adddynamicsnapshot_job viene utilizzato nella replica di tipo merge per le pubblicazioni che utilizzano un filtro con parametri.

Esempi

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

Autorizzazioni

Solo i membri del ruolo predefinito del server sysadmin o il ruolo predefinito del database db_owner possono eseguire sp_adddynamicsnapshot_job.