sp_addsubscription (Transact-SQL)

適用対象:SQL ServerAzure SQL Database

パブリケーションにサブスクリプションを追加し、サブスクライバーの状態を設定します。 このストアド プロシージャは、パブリッシャー側のパブリケーション データベースで実行されます。

Transact-SQL 構文表記規則

構文

sp_addsubscription
    [ @publication = ] N'publication'
    [ , [ @article = ] N'article' ]
    [ , [ @subscriber = ] N'subscriber' ]
    [ , [ @destination_db = ] N'destination_db' ]
    [ , [ @sync_type = ] N'sync_type' ]
    [ , [ @status = ] N'status' ]
    [ , [ @subscription_type = ] N'subscription_type' ]
    [ , [ @update_mode = ] N'update_mode' ]
    [ , [ @loopback_detection = ] N'loopback_detection' ]
    [ , [ @frequency_type = ] frequency_type ]
    [ , [ @frequency_interval = ] frequency_interval ]
    [ , [ @frequency_relative_interval = ] frequency_relative_interval ]
    [ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
    [ , [ @frequency_subday = ] frequency_subday ]
    [ , [ @frequency_subday_interval = ] frequency_subday_interval ]
    [ , [ @active_start_time_of_day = ] active_start_time_of_day ]
    [ , [ @active_end_time_of_day = ] active_end_time_of_day ]
    [ , [ @active_start_date = ] active_start_date ]
    [ , [ @active_end_date = ] active_end_date ]
    [ , [ @optional_command_line = ] N'optional_command_line' ]
    [ , [ @reserved = ] N'reserved' ]
    [ , [ @enabled_for_syncmgr = ] N'enabled_for_syncmgr' ]
    [ , [ @offloadagent = ] offloadagent ]
    [ , [ @offloadserver = ] N'offloadserver' ]
    [ , [ @dts_package_name = ] N'dts_package_name' ]
    [ , [ @dts_package_password = ] N'dts_package_password' ]
    [ , [ @dts_package_location = ] N'dts_package_location' ]
    [ , [ @distribution_job_name = ] N'distribution_job_name' ]
    [ , [ @publisher = ] N'publisher' ]
    [ , [ @backupdevicetype = ] N'backupdevicetype' ]
    [ , [ @backupdevicename = ] N'backupdevicename' ]
    [ , [ @mediapassword = ] N'mediapassword' ]
    [ , [ @password = ] N'password' ]
    [ , [ @fileidhint = ] fileidhint ]
    [ , [ @unload = ] unload ]
    [ , [ @subscriptionlsn = ] subscriptionlsn ]
    [ , [ @subscriptionstreams = ] subscriptionstreams ]
    [ , [ @subscriber_type = ] subscriber_type ]
    [ , [ @memory_optimized = ] memory_optimized ]
[ ; ]

引数

[ @publication = ] N'publication'

出版物の名前。 @publicationは sysname で、既定値はありません。

[ @article = ] N'article'

パブリケーションのサブスクライブ先のアーティクル。 @articleは sysname で、既定値は all. 場合 allは、そのパブリケーション内のすべてのアーティクルにサブスクリプションが追加されます。 Oracle パブリッシャーの all 値のみ、または NULL Oracle パブリッシャーでサポートされます。

[ @subscriber = ] N'subscriber'

サブスクライバーの名前。 @subscriberは sysname で、既定値は NULL.

Note

サーバー名は次のように <Hostname>,<PortNumber>指定できます。 SQL Server がカスタム ポートを使用して Linux または Windows にデプロイされ、ブラウザー サービスが無効になっている場合に、接続のポート番号を指定します。 リモート ディストリビューターのカスタム ポート番号の使用は、SQL Server 2019 (15.x) 以降のバージョンに適用されます。

[ @destination_db = ] N'destination_db'

レプリケートされたデータを配置するコピー先データベースの名前。 @destination_dbは sysname で、既定値は NULL. この場合 NULL@destination_db パブリケーション データベースの名前が設定されます。 Oracle パブリッシャーの場合は、 @destination_db を指定する必要があります。 SQL Server 以外のサブスクライバーの場合は、@destination_dbの値 (既定の宛先) を指定します。

[ @sync_type = ] N'sync_type'

サブスクリプション同期の種類。 @sync_typeは nvarchar(255)で、次のいずれかの値を指定できます。

Value 糞も味噌も一緒
none1 サブスクライバーには、パブリッシュされたテーブルのスキーマと初期データが既に存在します。
automatic (既定値) パブリッシュされたテーブルのスキーマと初期データは、最初にサブスクライバーに転送されます。
replication support only2 更新サブスクリプションをサポートするアーティクルのカスタム ストアド プロシージャとトリガーがサブスクライバー側で必要に応じて自動的に生成されます。 サブスクライバーがパブリッシュされたテーブルのスキーマと初期データを既に持っていることを前提としています。 ピアツーピア トランザクション レプリケーション トポロジを構成する場合は、トポロジ内のすべてのノードのデータが同じであることを確認します。 詳細については、「ピア ツー ピア - トランザクション レプリケーション」を参照してください
initialize with backup2 パブリッシュされたテーブルのスキーマと初期データは、パブリケーション データベースのバックアップから取得されます。 サブスクライバーがパブリケーション データベースのバックアップにアクセスできるものとします。 バックアップのバックアップの場所とメディアの種類は、@backupdevicename@backupdevicetypeによって指定されます。 このオプションを使用する場合、ピアツーピア トランザクション レプリケーション トポロジを構成中に休止させる必要はありません。
initialize from lsn ピア ツー ピア トランザクション レプリケーション トポロジにノードを追加するときに使用されます。 @subscriptionlsn と共に使用すると、関連するトランザクションのすべてが、新しいノードに確実にレプリケートされます。 サブスクライバーがパブリッシュされたテーブルのスキーマと初期データを既に持っていることを前提としています。 詳細については、「ピア ツー ピア - トランザクション レプリケーション」を参照してください

1 このオプションは非推奨になりました。 代わりに replication support only を使用してください。

2 SQL Server 以外のパブリケーションのサブスクリプションではサポートされていません。

Note

システム テーブルとデータは常に転送されます。

[ @status = ] N'status'

サブスクリプションの状態。 @statusは sysname で、既定値は NULL. このパラメーターが明示的に設定されていない場合、レプリケーションによってこれらの値のいずれかが自動的に設定されます。

Value 説明
active サブスクリプションが初期化され、変更を受け入れる準備が整いました。 このオプションは、@sync_type値が none、initialize with backup、または replication support only の場合に設定されます。
subscribed サブスクリプションを初期化する必要があります。 このオプションは、@sync_type値が自動である場合に設定されます。

[ @subscription_type = ] N'subscription_type'

サブスクリプションの種類。 @subscription_typeは nvarchar(4) で、既定値は push. push または pull を指定できます。 プッシュ サブスクリプションのディストリビューション エージェントはディストリビューターに存在し、プル サブスクリプションのディストリビューション エージェントはサブスクライバーに存在します。 @subscription_type、パブリッシャーに認識されている名前付きプル サブスクリプションを作成できますpull。 詳細については、「パブリケーションのサブスクライブ」をご覧ください。

Note

匿名サブスクリプションでは、このストアド プロシージャを使用する必要はありません。

[ @update_mode = ] N'update_mode'

更新プログラムの種類。 @update_modeは nvarchar(30)で、これらの値のいずれかを指定できます。

Value 説明
read only (既定値) サブスクリプションは読み取り専用です。 サブスクライバーでの変更はパブリッシャーに送信されません。
sync tran 即時更新サブスクリプションのサポートを有効にします。 Oracle パブリッシャーではサポートされていません。
queued tran サブスクリプションのキュー更新を有効にします。 データの変更はサブスクライバーで行い、キューに格納してからパブリッシャーに伝達できます。 Oracle パブリッシャーではサポートされていません。
failover キュー更新をフェールオーバーとするサブスクリプションの即時更新を有効にします。 サブスクライバーでデータを変更し、それを直ちにパブリッシャーに配信することができます。 パブリッシャーとサブスクライバーが接続されていない場合は、サブスクライバーとパブリッシャーが再接続されるまで、サブスクライバーで行われたデータ変更がキューに格納されるように更新モードを変更できます。 Oracle パブリッシャーではサポートされていません。
queued failover 即時更新モードへの変更が可能なキュー更新サブスクリプションとしてサブスクリプションを有効にします。 データの変更はサブスクライバーで行い、サブスクライバーとパブリッシャーの間で接続が確立されるまでキューに格納できます。 継続的な接続が確立されると、更新モードを即時更新に変更できます。 Oracle パブリッシャーではサポートされていません。

sync tran値。queued tranサブスクライブしているパブリケーションで DTS が許可されている場合は許可されません。

[ @loopback_detection = ] N'loopback_detection'

ディストリビューション エージェントがサブスクライバーで発生したトランザクションをサブスクライバーに送り返すかどうかを指定します。 @loopback_detectionは nvarchar(5) であり、これらの値のいずれかを指定できます。

Value 説明
true ディストリビューション エージェントは、サブスクライバーで発生したトランザクションをサブスクライバーに送信しません。 双方向トランザクション レプリケーションで使用されます。 詳細については、「 Bidirectional Transactional Replication」を参照してください。
false ディストリビューション エージェントは、サブスクライバーで発生したトランザクションをサブスクライバーに戻します。
NULL (既定値) SQL Server サブスクライバーの場合は自動的に true、SQL Server 以外のサブスクライバーの場合は false に設定されます。

[ @frequency_type = ] frequency_type

配布タスクをスケジュールする頻度。 @frequency_typeは int であり、これらの値のいずれかになります。

Value 説明
1 指定日時
2 オンデマンド
4 毎日
8 週単位
16 月単位
32 月単位の相対
64 (既定値) Autostart
128 定期的

[ @frequency_interval = ] frequency_interval

@frequency_typeによって設定された頻度に適用する値。 @frequency_intervalは int で、既定値は NULL.

[ @frequency_relative_interval = ] frequency_relative_interval

ディストリビューション エージェントの日付。 このパラメーターは、@frequency_typeが (月単位の相対) に設定されている場合32使用されます。 @frequency_relative_intervalは int であり、これらの値のいずれかになります。

Value 説明
1 最初
2 Second
4 Third
8 4 番目
16 Last (最後へ)
NULL (既定値)

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

@frequency_typeによって使用される 繰り返し係数。 @frequency_recurrence_factorは int で、既定値は NULL.

[ @frequency_subday = ] frequency_subday

定義された期間中に再スケジュールする頻度 (分単位)。 @frequency_subdayは int であり、これらの値のいずれかになります。

Value 説明
1 1 回。
2 Second
4
8 時間
NULL

[ @frequency_subday_interval = ] frequency_subday_interval

@frequency_subday間隔。 @frequency_subday_intervalは 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.

[ @active_start_date = ] active_start_date

ディストリビューション エージェントが最初にスケジュールされた日付。形式yyyyMMddは .. @active_start_dateは int で、既定値は NULL.

[ @active_end_date = ] active_end_date

ディストリビューション エージェントのスケジュールが終了した日付。次のようにyyyyMMdd書式設定されます。 @active_end_dateは int で、既定値は NULL.

[ @optional_command_line = ] N'optional_command_line'

実行するオプションのコマンド プロンプト。 @optional_command_lineは nvarchar(4000) で、既定値は NULL.

[ @reserved = ] N'reserved'

単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。

[ @enabled_for_syncmgr = ] N'enabled_for_syncmgr'

サブスクリプションを Windows 同期マネージャーを使用して同期できるかどうかを指定します。 @enabled_for_syncmgrは nvarchar(5) で、既定値は NULLfalse. 場合 false、サブスクリプションは Windows 同期マネージャーに登録されていません。 の場合 true、サブスクリプションは Windows 同期マネージャーに登録され、SQL Server Management Studio を起動せずに同期できます。 Oracle パブリッシャーではサポートされていません。

[ @offloadagent = ] offloadagent

エージェントをリモートでアクティブ化できることを指定します。 @offloadagentはビットで、既定値は 0.

Note

このパラメーターは非推奨となり、スクリプトの下位互換性のためにのみメインされます。

[ @offloadserver = ] N'offloadserver'

リモート ライセンス認証に使用するサーバーのネットワーク名を指定します。 @offloadserverは sysname で、既定値は NULL.

[ @dts_package_name = ] N'dts_package_name'

データ変換サービス (DTS) パッケージの名前を指定します。 @dts_package_nameは sysname で、既定値は NULL. たとえば、DTSPub_Package というパッケージを指定するには、パラメーターを @dts_package_name = N'DTSPub_Package' と設定します。 このパラメーターは、プッシュ サブスクリプションで使用できます。 DTS パッケージ情報をプル サブスクリプションに追加するには、次を使用 sp_addpullsubscription_agentします。

[ @dts_package_password = ] N'dts_package_password'

パッケージにパスワードがある場合は、そのパスワードを指定します。 @dts_package_passwordは sysname で、既定値は NULL.

Note

@dts_package_nameが指定されている場合は、パスワードを指定する必要があります。

[ @dts_package_location = ] N'dts_package_location'

パッケージの場所を指定します。 @dts_package_locationは nvarchar(12) で、既定値は NULLdistributor. パッケージの場所は、次subscriberのいずれかになりますdistributor

[ @distribution_job_name = ] N'distribution_job_name'

単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。

[ @publisher = ] N'publisher'

SQL Server 以外のパブリッシャーを指定します。 @publisherは sysname で、既定値は NULL.

Note

@publisherは、SQL Server パブリッシャーに対して指定しないでください。

[ @backupdevicetype = ] N'backupdevicetype'

バックアップからサブスクライバーを初期化する際に使用するバックアップ デバイスの種類を指定します。 @backupdevicetypeは nvarchar(20)で、次のいずれかの値を指定できます。

Value 説明
logical (既定値) バックアップ デバイスが論理デバイスである
disk バックアップ デバイスがディスク ドライブである
tape バックアップ デバイスがテープ ドライブである

@backupdevicetypeは、@sync_methodが initialize_with_backup に設定されている場合にのみ使用されます。

[ @backupdevicename = ] N'backupdevicename'

バックアップからサブスクライバーを初期化する際に使用するデバイスの名前を指定します。 @backupdevicenameは nvarchar(1000) で、既定値は NULL.

[ @mediapassword = ] N'mediapassword'

メディア セットのパスワードを指定します (メディアをフォーマットしたときにパスワードを設定した場合)。 @mediapasswordは sysname で、既定値は NULL.

Note

この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

[ @password = ] N'password'

バックアップのパスワードを指定します (バックアップを作成したときにパスワードを設定した場合)。 @passwordは sysname で、既定値は NULL.

[ @fileidhint = ] fileidhint

復元するバックアップ セットの序数値を識別します。 @fileidhintは int で、既定値は NULL.

[ @unload = ] unload

バックアップからの初期化が完了した後テープ バックアップ デバイスをアンロードするかどうかを指定します。 @unloadはビットで、既定値は1テープをアンロードすることを指定します。 @unloadは、@backupdevicetypetape.

[ @subscriptionlsn = ] subscriptionlsn

サブスクリプションがピアツーピア トランザクション レプリケーション トポロジ内のノードへの変更の配信を開始するログ シーケンス番号 (LSN) を指定します。 @subscriptionlsnは binary(10) で、既定値は NULL. @sync_type値initialize from lsnと共に使用して、関連するすべてのトランザクションが新しいノードにレプリケートされるようにします。 詳細については、「ピア ツー ピア - トランザクション レプリケーション」を参照してください

[ @subscriptionstreams = ] subscriptionstreams

1 つのスレッドを使用する場合に存在メイントランザクション特性の多くを保持しながら、サブスクライバーに変更のバッチを並列に適用するために、ディストリビューション エージェントごとに許可される接続の数。 @subscriptionstreamsは tinyint で、既定値は NULL. 値の164範囲がサポートされています。 このパラメーターは、SQL Server 以外のサブスクライバー、Oracle パブリッシャー、またはピア ツー ピア サブスクリプションではサポートされていません。 @subscriptionstreamsが使用されるたびに、テーブルにmsreplication_subscriptions追加の行が追加されます (ストリームごとに 1 行)。agent_idNULL

Note

サブスクリプション ストリームは、Transact-SQL を配信するように構成された記事では機能しません。 サブスクリプション ストリームを使用するには、代わりにストアド プロシージャ呼び出しを配信するようにアーティクルを構成します。

[ @subscriber_type = ] subscriber_type

サブスクライバーの種類。 @subscriber_typeは tinyint であり、これらの値のいずれかになります。

Value 説明
0 (既定値) SQL Server サブスクライバー
1 ODBC データ ソース サーバー
2 Microsoft Jet データベース
3 OLE DB プロバイダー

[ @memory_optimized = ] memory_optimized

サブスクリプションがメモリ最適化テーブルをサポートしていることを示します。 @memory_optimizedはビットで、既定値は 0 (false) です。 1 (true) は、サブスクリプションがメモリ最適化テーブルをサポートしていることを意味します。

リターン コードの値

0 (成功) または 1 (失敗)。

解説

sp_addsubscriptionは、スナップショット レプリケーションとトランザクション レプリケーションで使用されます。

sysadmin 固定サーバー ロールのメンバーがプッシュ サブスクリプションを作成するために実行されるとsp_addsubscription、ディストリビューション エージェント ジョブが暗黙的に作成され、SQL Server エージェント サービス アカウントで実行されます。 sp_addpushsubscription_agentを実行し、エージェント固有の別の Windows アカウント@job_login@job_passwordの資格情報を指定することをお勧めします。 詳細については、「 レプリケーション エージェント セキュリティ モデル」を参照してください。

sp_addsubscription では、ODBC および OLE DB サブスクライバーが次のパブリケーションにアクセスできなくなります。

  • sp_addpublicationの呼び出しでネイティブ @sync_methodを使用して作成されました。

  • @pre_creation_cmd パラメーター値が 3 (切り捨て) のsp_addarticleストアド プロシージャを使用してパブリケーションに追加されたアーティクルが含まれます。

  • @update_modeの設定sync tran試みます。

  • パラメーター化されたステートメントを使用するように構成されたアーティクルを含むパブリケーション。

さらに、パブリケーションで @allow_queued_tran オプションが true に設定されている場合 (パブリッシャーで適用できるようになるまでサブスクライバーでの変更のキューを有効にします)、アーティクルのタイムスタンプ列はタイムスタンプとしてスクリプト化され、その列の変更がサブスクライバーに送信されます。 サブスクライバーは、タイムスタンプ列の値を生成して更新します。 ODBC または OLE DB サブスクライバーの場合、sp_addsubscription@allow_queued_tran true に設定されたパブリケーションとタイムスタンプ列を含むアーティクルをサブスクライブしようとすると失敗します。

サブスクリプションで DTS パッケージが使用されていない場合、@allow_transformable_subscriptionsに設定されているパブリケーションをサブスクライブすることはできません。 パブリケーションのテーブルを DTS サブスクリプションと非 DTS サブスクリプションの両方にレプリケートする必要がある場合は、サブスクリプションの種類ごとに 1 つずつ、2 つの別々のパブリケーションを作成する必要があります。

sync_type オプション (または) を選択する場合、セットアップ スクリプトがディストリビューション データベースに書き込まれるように、ログ リーダー エージェントは実行sp_addsubscription後に実行する必要があります。initialize from lsninitialize with backupreplication support only ログ リーダー エージェントが、 sysadmin 固定サーバー ロールのメンバーであるアカウントで実行されている必要があります。 @sync_type オプションがAutomatic設定されている場合、特別なログ リーダー エージェントアクションは必要ありません。

アクセス許可

sysadmin 固定サーバー ロールまたは固定データベース ロールdb_ownerメンバーのみが実行sp_addsubscriptionできます。 プル サブスクリプションの場合、パブリケーション アクセス リストにログインしているユーザーは実行 sp_addsubscriptionできます。

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2022Replica';

--Add a push subscription to a transactional publication.
USE [AdventureWorks2022]
EXEC sp_addsubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @destination_db = @subscriptionDB, 
  @subscription_type = N'push';

--Add an agent job to synchronize the push subscription.
EXEC sp_addpushsubscription_agent 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO