sp_adddynamicsnapshot_job (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
パラメーター化された行フィルターを使用してパブリケーションのフィルター処理されたデータ スナップショットを生成するエージェント ジョブを作成します。 このストアド プロシージャは、パブリッシャー側のパブリケーション データベースで実行されます。 このストアド プロシージャは、サブスクライバーのフィルター処理されたデータ スナップショット ジョブを手動で作成するために管理者によって使用されます。
Note
フィルター処理されたデータ スナップショット ジョブを作成するには、パブリケーションの標準スナップショット ジョブが既に存在している必要があります。
詳しくは、「 パラメーター化されたフィルターを使用したパブリケーションのスナップショットの作成」をご覧ください。
構文
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 は、 sysname 型の OUTPUT パラメーターです。 指定した場合、 @dynamic_snapshot_jobname ディストリビューターの一意のジョブに解決する必要があります。 指定しない場合、ジョブ名は結果セットに自動的に生成されます。この名前は次のように作成されます。
'dyn_' + <name of the standard snapshot job> + <GUID>
Note
動的スナップショット ジョブの名前を生成するときに、標準スナップショット ジョブの名前を切り捨てる場合があります。
[ @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 つ以上 ( と組み合わせたもの|(ビットごとの OR) 論理演算子):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 (既定値) |
1 回。 |
2 |
Second |
4 |
分 |
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 |
Second |
4 |
Third |
8 |
4 番目 |
16 |
最後 |
[ @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
を実行できます。