Поделиться через


Хранимая процедура sp_adddynamicsnapshot_job (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

Создает задание агента, которое формирует моментальный снимок отфильтрованных данных для публикации с параметризированными фильтрами строк. Эта хранимая процедура выполняется на издателе в базе данных публикации. Эта хранимая процедура используется администратором, чтобы вручную создавать задания моментальных снимков отфильтрованных данных для подписчиков.

Примечание.

Чтобы создать задание моментального снимка отфильтрованных данных, необходимо существование стандартного задания моментальных снимков для публикации.

Дополнительные сведения см. в статье Создание моментального снимка для публикации слиянием с параметризованными фильтрами.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Аргументы

[ @publication = ] N'publication'

Имя публикации, в которую добавляется задание моментального снимка отфильтрованных данных. @publication — sysname без значения по умолчанию.

[ @suser_sname = ] N'suser_sname'

Значение, используемое при создании отфильтрованного моментального снимка данных для подписки, отфильтрованной по значению функции SUSER_SNAME на подписчике. @suser_sname — sysname с значением по умолчаниюNULL. @suser_sname должно бытьNULL, если эта функция не используется для динамической фильтрации публикации.

[ @host_name = ] N'host_name'

Значение, используемое при создании отфильтрованного моментального снимка данных для подписки, отфильтрованной по значению функции HOST_NAME на подписчике. @host_name — sysname с значением по умолчаниюNULL. host_name должно бытьNULL, если эта функция не используется для динамической фильтрации публикации.

[ @dynamic_snapshot_jobname = ] N'dynamic_snapshot_jobname' OUTPUT

Имя созданного задания моментального снимка отфильтрованных данных. @dynamic_snapshot_jobname — это параметр OUTPUT типа sysname. При указании @dynamic_snapshot_jobname необходимо разрешить уникальное задание на распространителю. Если не указано, имя задания автоматически создается в результирующем наборе, где имя создается следующим образом:

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

Примечание.

При создании имени задания динамического моментального снимка можно усечь имя стандартного задания моментального снимка.

[ @dynamic_snapshot_jobid = ] "dynamic_snapshot_jobid" OUTPUT

Идентификатор созданного задания моментального снимка отфильтрованных данных. @dynamic_snapshot_jobid — это параметр OUTPUT типа uniqueidentifier с значением по умолчаниюNULL.

[ @frequency_type = ] frequency_type

Указывает частоту планирования задания моментального снимка отфильтрованного снимка данных. @frequency_type является int и может быть одним из этих значений.

значение Описание
1 Один раз.
2 (по умолчанию) по запросу
4 Ежедневно
8 Weekly (Еженедельно);
16 Ежемесячная
32 Ежемесячно с относительной датой
64 Автозапуск
128 Повторяющееся задание

[ @frequency_interval = ] frequency_interval

Период, измеряемый в днях, когда выполняется отфильтрованное задание моментального снимка данных. @frequency_interval является int и зависит от значения @frequency_type.

Значение @frequency_type Влияние на @frequency_interval
1 (по умолчанию) @frequency_interval не используется.
4 Каждые @frequency_interval дней.
8 @frequency_interval является одним или несколькими из следующих (в сочетании с | (битовое ИЛИ) логический оператор):

1 = воскресенье
2 = понедельник
4 = вторник
8 = среда
16 = четверг
32 = пятница
64 = суббота
16 На @frequency_interval день месяца.
32 @frequency_interval является одним из следующих вариантов:

1 = воскресенье
2 = понедельник
3 = вторник
4 = среда
5 = четверг
6 = пятница
7 = суббота
8 = день
9 = еженедельный день
10 = выходные дни
64 @frequency_interval не используется.
128 @frequency_interval не используется.

[ @frequency_subday = ] frequency_subday

Задает единицы для @frequency_subday_interval. @frequency_subday является int и может быть одним из этих значений.

значение Описание
1 (по умолчанию) Однократно
2 Second
4 Minute
8 Часы

[ @frequency_subday_interval = ] frequency_subday_interval

Количество frequency_subday периодов, происходящих между каждым выполнением задания. @frequency_subday_interval имеет значение int с значением по умолчанию1.

[ @frequency_relative_interval = ] frequency_relative_interval

Вхождение задания моментального снимка отфильтрованных данных в каждом месяце. Этот параметр используется, если @frequency_type задано 32 значение (ежемесячное относительное). @frequency_relative_interval является int и может быть одним из этих значений.

значение Описание
1 (по умолчанию) First
2 Second
4 Третья
8 Четвертая
16 Last

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

Коэффициент повторения, используемый frequency_type. @frequency_recurrence_factor имеет значение int с значением по умолчанию1.

[ @active_start_date = ] active_start_date

Дата, когда задание моментального снимка отфильтрованных данных сначала запланировано, отформатировано как yyyyMMdd. @active_start_date имеет значение int с значением по умолчанию0.

[ @active_end_date = ] active_end_date

Дата, когда задание моментального снимка отфильтрованных данных перестает планироваться, отформатировано как yyyyMMdd. @active_end_date имеет значение int с значением по умолчанию0.

[ @active_start_time_of_day = ] active_start_time_of_day

Время дня, когда задание моментального снимка отфильтрованных данных сначала запланировано, отформатировано как HHmmss. @active_start_time_of_day имеет значение int с значением по умолчанию0.

[ @active_end_time_of_day = ] active_end_time_of_day

Время дня, когда задание моментального снимка отфильтрованных данных перестает планироваться, отформатировано как HHmmss. @active_end_time_of_day имеет значение int с значением по умолчанию0.

Результирующий набор

Имя столбца Тип данных Description
id int Определяет задание моментального снимка отфильтрованных данных в системной таблице MSdynamicsnapshotjobs .
dynamic_snapshot_jobname sysname Имя задания моментального снимка фильтрованных данных.
dynamic_snapshot_jobid uniqueidentifier Уникально идентифицирует задание агент SQL Server на распространителю.

Значения кода возврата

0 (успешно) или 1 (сбой).

Замечания

sp_adddynamicsnapshot_job используется в репликации слиянием для публикаций, использующих параметризованный фильтр.

Примеры

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

Разрешения

Могут выполняться sp_adddynamicsnapshot_jobтолько члены предопределенных ролей сервера sysadmin или db_owner предопределенных ролей базы данных.