sp_adddynamicsnapshot_job (Transact-SQL)
パラメータ化された行フィルタを使用したパブリケーションに対して、フィルタ選択されたデータ スナップショットを生成するエージェント ジョブを作成します。このストアド プロシージャは、パブリッシャ側でパブリケーション データベースについて実行されます。このストアド プロシージャは管理者によって使用されるもので、フィルタ選択されたデータ スナップショット ジョブを、サブスクライバに対して手動で作成することができます。
注意 |
---|
フィルタ選択されたデータ スナップショット ジョブを作成するには、パブリケーションに対する標準スナップショット ジョブが既に存在している必要があります。 |
詳細については、「パラメータ化されたフィルタを使用したマージ パブリケーションのスナップショット」を参照してください。
構文
sp_adddynamicsnapshot_job [ @publication = ] 'publication'
[ , [ @suser_sname = ] 'suser_sname' ]
[ , [ @host_name = ] 'host_name' ]
[ , [ @dynamic_snapshot_jobname = ] '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=] 'publication'
フィルタ選択されたデータ スナップショット ジョブを追加するパブリケーションの名前を指定します。publication のデータ型は sysname で、既定値はありません。[ @suser_sname= ] 'suser_sname'
サブスクライバ側で SUSER_SNAME 関数の値によりサブスクリプションがフィルタ選択される場合、このサブスクリプションに対して、フィルタ選択されたデータ スナップショットを作成するときに使用する値を指定します。suser_sname のデータ型は sysname で、既定値はありません。パブリケーションを動的にフィルタ選択するときに、この関数を使用しない場合は、suser_sname は NULL にします。[ @host_name= ] 'host_name'
サブスクライバ側で HOST_NAME 関数の値によりサブスクリプションがフィルタ選択される場合、このサブスクリプションに対して、フィルタ選択されたデータ スナップショットを作成するときに使用する値を指定します。host_name のデータ型は sysname で、既定値はありません。パブリケーションを動的にフィルタ選択するときに、この関数を使用しない場合は、host_name は NULL にします。[ @dynamic_snapshot_jobname= ] 'dynamic_snapshot_jobname'
作成するフィルタ選択されたデータ スナップショット ジョブの名前です。dynamic_snapshot_jobname のデータ型は sysname で、既定値は NULL です。これは省略可能な OUTPUT パラメータです。指定する場合、dynamic_snapshot_jobname はディストリビュータ側で一意なジョブになる必要があります。指定しない場合、ジョブ名が自動的に生成され、結果セットに返されます。この場合、次のような名前が作成されます。'dyn_' + <name of the standard snapshot job> + <GUID>
注意 動的スナップショット ジョブの名前を生成すると、標準スナップショット ジョブの名前が切り捨てられる場合があります。
[ @dynamic_snapshot_jobid = ] 'dynamic_snapshot_jobid'
作成するフィルタ選択されたデータ スナップショット ジョブの識別子です。dynamic_snapshot_jobid のデータ型は uniqueidentifier で、既定値は NULL です。これは省略可能な OUTPUT パラメータです。[ @frequency_type=] frequency_type
フィルタ選択されたデータ スナップショット ジョブをスケジュールに組み込む頻度を指定します。frequency_type のデータ型は int で、次のいずれかの値を指定できます。値
説明
1
指定日時
2
要求時
4 (既定値)
毎日
8
毎週
16
毎月
32
月単位
64
自動的に起動
128
定期的
[ @frequency_interval=] frequency_interval
フィルタ選択されたデータ スナップショット ジョブを実行する場合の日数を指定します。frequency_interval のデータ型は int で、既定値は 1 です。frequency_type の値に依存します。frequency_type の値
frequency_interval への影響
1
frequency_interval は使用されません。
4 (既定値)
frequency_interval の日数ごとに実行されます。既定値は毎日です。
8
frequency_interval には次の値を 1 つ以上指定できます (| (ビット演算子 OR) (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_subday のデータ型は int で、次のいずれかの値を指定できます。値
説明
1
1 回
2
秒
4 (既定値)
分
8
時間
[ @frequency_subday_interval=] frequency_subday_interval
ジョブの各実行間に発生する frequency_subday 期間の数を指定します。frequency_subday_interval のデータ型は int で、既定値は 5 です。[ @frequency_relative_interval=] frequency_relative_interval
毎月の、フィルタ選択されたデータ スナップショット ジョブの発生日を指定します。このパラメータは、frequency_type に 32 (月単位) を指定した場合に使用されます。frequency_relative_interval のデータ型は int で、次のいずれかの値を指定できます。値
説明
1 (既定値)
第 1
2
第 2
4
第 3
8
第 4
16
最終
[ @frequency_recurrence_factor=] frequency_recurrence_factor
frequency_type で使用される定期実行係数を指定します。frequency_recurrence_factor のデータ型は int で、既定値は 0 です。[ @active_start_date=] active_start_date
フィルタ選択されたデータ スナップショット ジョブが最初にスケジュールに組み込まれる日を YYYYMMDD 形式で指定します。active_start_date のデータ型は int で、既定値は NULL です。[ @active_end_date=] active_end_date
フィルタ選択されたデータ スナップショット ジョブがスケジュールに組み込まれなくなる日を YYYYMMDD 形式で指定します。active_end_date のデータ型は int で、既定値は NULL です。[ @active_start_time_of_day=] active_start_time_of_day
フィルタ選択されたデータ スナップショット ジョブが最初にスケジュールに組み込まれる時刻を HHMMSS 形式で指定します。active_start_time_of_day のデータ型は int で、既定値は NULL です。[ @active_end_time_of_day=] active_end_time_of_day
フィルタ選択されたデータ スナップショット ジョブがスケジュールに組み込まれなくなる時刻を HHMMSS 形式で指定します。active_end_time_of_day のデータ型は int で、既定値は NULL です。
結果セット
列名 |
データ型 |
説明 |
---|---|---|
id |
int |
MSdynamicsnapshotjobs システム テーブルの、フィルタ選択されたデータ スナップショット ジョブの識別子。 |
dynamic_snapshot_jobname |
sysname |
フィルタ処理されたスナップショット ジョブの名前。 |
dynamic_snapshot_jobid |
uniqueidentifier |
ディストリビュータ側の MicrosoftSQL 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'AdventureWorks';
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 [AdventureWorks];
-- Enable AdventureWorks 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 AdventureWorks.',
@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].[EmployeeID] = [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 固定データベース ロールのメンバだけです。