Хранимая процедура 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 предопределенных ролей базы данных.