sp_adddynamicsnapshot_job (Transact-SQL)
适用于: SQL Server Azure 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
. 如果此函数不用于动态筛选发布,则应NULL
@suser_sname。
[ @host_name = ] N'host_name'
为订阅创建筛选的数据快照时使用的值,该快照由订阅服务器上的HOST_NAME函数的值进行筛选。 @host_name为 sysname,默认值为 NULL
. 如果此函数不用于动态筛选发布,则应NULL
host_name。
[ @dynamic_snapshot_jobname = ] N'dynamic_snapshot_jobname' OUTPUT
已创建筛选的数据快照作业的名称。 @dynamic_snapshot_jobname是 sysname 类型的 OUTPUT 参数。 如果指定, @dynamic_snapshot_jobname 必须在分发服务器上解析为唯一作业。 如果未指定,则会在结果集中自动生成作业名称,其中将按如下所示创建名称:
'dyn_' + <name of the standard snapshot job> + <GUID>
注意
生成动态快照作业的名称时,可以截断标准快照作业的名称。
[ @dynamic_snapshot_jobid = ] 'dynamic_snapshot_jobid' OUTPUT
已创建的筛选数据快照作业的标识符。 @dynamic_snapshot_jobid是 uniqueidentifier 类型的 OUTPUT 参数,默认值为 NULL
.
[ @frequency_type = ] frequency_type
指定按其计划筛选的数据快照作业的频率。 @frequency_type为 int,可以是这些值之一。
值 | 说明 |
---|---|
1 |
一次 |
2 (默认值) |
按需 |
4 |
每日 |
8 |
每周 |
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 (默认值) |
第一个 |
2 |
第二个 |
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
.
结果集
列名称 | 数据类型 | 描述 |
---|---|---|
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
权限
只有 sysadmin 固定服务器角色的成员或db_owner固定数据库角色的成员才能执行sp_adddynamicsnapshot_job
。