sp_adddynamicsnapshot_job (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

创建一个代理作业,该代理作业可为具有参数化行筛选器的发布生成筛选数据快照。 此存储过程在发布服务器上对发布数据库执行。 管理员使用此存储过程可手动为订阅服务器创建筛选数据快照作业。

注意

为了创建筛选数据快照作业,必须存在该发布的标准快照作业。

有关详细信息,请参阅 为包含参数化筛选器的合并发布创建快照

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'

要向其添加筛选数据快照作业的发布的名称。 @publicationsysname,无默认值。

[ @suser_sname = ] N'suser_sname'

为订阅创建筛选的数据快照时使用的值,该订阅按订阅服务器上的 SU标准版R_SNAME 函数的值进行筛选。 @suser_sname为 sysname,默认值为 NULL. 如果此函数不用于动态筛选发布,则应NULL@suser_sname

[ @host_name = ] N'host_name'

为订阅创建筛选的数据快照时使用的值,该订阅按订阅服务器上的 HOST_NAME 函数的值进行筛选。 @host_name为 sysname,默认值为 NULL. 如果此函数不用于动态筛选发布,则应NULLhost_name

[ @dynamic_snapshot_jobname = ] N'dynamic_快照_jobname' OUTPUT

创建的筛选数据的名称快照作业。 @dynamic_快照_jobname是 sysname 类型的 OUTPUT 参数。 如果指定,@dynamic_快照_jobname必须在分发服务器上解析为唯一作业。 如果未指定,则会在结果集中自动生成作业名称,其中将按如下所示创建名称:

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

注意

生成动态快照作业的名称时,可能会截断标准快照作业的名称。

[ @dynamic_snapshot_jobid = ] 'dynamic_快照_jobid' OUTPUT

已筛选的数据快照创建的作业的标识符。 @dynamic_快照_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是以下一个或多个(与 | 结合使用)(按位或)(Transact-SQL)逻辑运算符):

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_subdayint,可以是以下值之一。

说明
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 标识 MSdynamic快照jobs 系统表中筛选的数据快照作业
dynamic_snapshot_jobname sysname 已筛选数据快照作业的名称。
dynamic_snapshot_jobid uniqueidentifier 唯一标识分发服务器上SQL Server 代理作业。

返回代码值

0(成功)或 1(失败)。

注解

sp_adddynamicsnapshot_job用于使用参数化筛选器的发布的合并副本 (replica)tion。

示例

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