sp_addsubscription (Transact-SQL)
將訂閱加入發行集中,以及設定訂閱者狀態。這個預存程序執行於發行集資料庫的發行者端。
語法
sp_addsubscription [ @publication = ] 'publication'
[ , [ @article = ] 'article']
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @destination_db = ] 'destination_db' ]
[ , [ @sync_type = ] 'sync_type' ]
[ , [ @status = ] 'status'
[ , [ @subscription_type = ] 'subscription_type' ]
[ , [ @update_mode = ] 'update_mode' ]
[ , [ @loopback_detection = ] '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 = ] 'optional_command_line' ]
[ , [ @reserved = ] 'reserved' ]
[ , [ @enabled_for_syncmgr= ] 'enabled_for_syncmgr' ]
[ , [ @offloadagent= ] remote_agent_activation]
[ , [ @offloadserver= ] 'remote_agent_server_name' ]
[ , [ @dts_package_name= ] 'dts_package_name' ]
[ , [ @dts_package_password= ] 'dts_package_password' ]
[ , [ @dts_package_location= ] 'dts_package_location' ]
[ , [ @distribution_job_name= ] 'distribution_job_name' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @backupdevicetype = ] 'backupdevicetype' ]
[ , [ @backupdevicename = ] 'backupdevicename' ]
[ , [ @mediapassword = ] 'mediapassword' ]
[ , [ @password = ] 'password' ]
[ , [ @fileidhint = ] fileidhint ]
[ , [ @unload = ] unload ]
[ , [ @subscriptionlsn = ] subscriptionlsn ]
[ , [ @subscriptionstreams = ] subscriptionstreams ]
[ , [ @subscriber_type = ] subscriber_type ]
引數
- [ @publication=] 'publication'
這是發行集的名稱。publication 是 sysname,沒有預設值。
- [ @article=] 'article'
這是發行集的訂閱發行項。article 是 sysname,預設值是 all。如果是 all,就會將訂閱加入這個發行集的所有發行項中。只支援 Oracle 發行者使用 all 或 NULL 值。
- [ @subscriber=] 'subscriber'
這是訂閱者的名稱。subscriber 是 sysname,預設值是 NULL。
- [ @destination_db=] 'destination_db'
這是放置複寫資料的目的地資料庫名稱。destination_db 是 sysname,預設值是 NULL。當它是 NULL 時,destination_db 會設定為發行集資料庫的名稱。如果是 Oracle 發行者,您必須指定 destination_db。如果是非 SQL Server 訂閱者,請為 destination_db 指定 (預設目的地) 的值。
[ @sync_type=] 'sync_type'
這是訂閱同步處理類型。sync_type 是 nvarchar(255),它可以是下列值之一:值
[ @status=] 'status'
這是訂閱狀態。status 是 sysname,預設值是 NULL。如果未明確設定這個參數,複寫會自動將它設定為這些值之一。值 描述 active
訂閱已初始化且已做好接受變更的準備。當 sync_type 的值是 none、initialize with backup 或 replication support only 時,便會設定這個選項。
subscribed
訂閱需要初始化。當 sync_type 的值是 automatic 時,便會設定這個選項。
[ @subscription_type=] 'subscription_type'
這是訂閱的類型。subscription_type 是 nvarchar(4),預設值是 push。它可以是 push 或 pull。push 訂閱的散發代理程式位於散發者端,pull 訂閱的散發代理程式位於訂閱者端。subscription_type 可以是 pull,以便建立發行者已知的具名提取訂閱。如需詳細資訊,請參閱<訂閱發行集>。附註: 匿名訂閱不需要使用這個預存程序。
[ @update_mode=] 'update_mode'
這是更新的類型。update_mode 是 nvarchar(30),它可以是下列值之一。值 描述 read-only (預設值)
訂閱是唯讀的。在訂閱者端的變更不會傳給發行者。
sync tran
啟用立即更新訂閱的支援。不支援 Oracle 發行者使用這個值。
queued tran
啟用佇列更新的訂閱。資料修改可以在訂閱者端進行、儲存在佇列中,再傳播給發行者。不支援 Oracle 發行者使用這個值。
failover
啟用立即更新的訂閱,且利用佇列更新來作為容錯移轉。資料修改可以在訂閱者端進行,再立即傳播給發行者。如果發行者和訂閱者並未連接,便可以變更更新模式,以便將在訂閱者端進行的資料修改儲存在佇列中,直到發行者和訂閱者重新連接為止。不支援 Oracle 發行者使用這個值。
queued failover
將訂閱啟用成能夠改成立即更新模式的佇列更新訂閱。資料修改可以在訂閱者端進行,儲存在佇列中,直到重建訂閱者和發行者之間的連接為止。當建立連續連接時,更新模式可以改成立即更新。不支援 Oracle 發行者使用這個值。
請注意,如果訂閱的發行集允許 DTS,便不接受 synctran 和 queued tran 值。
[ @loopback_detection=] 'loopback_detection'
指定散發代理程式是否將起源於訂閱者端的交易傳回給訂閱者。loopback_detection 是 nvarchar(5),它可以是下列值之一。值 描述 true
散發代理程式不將起源於訂閱者端的交易傳回給訂閱者。搭配雙向交易式複寫來使用。如需詳細資訊,請參閱<雙向交易式複寫>。
false
散發代理程式將起源於訂閱者端的交易傳回給訂閱者。
NULL (預設值)
針對 SQL Server 訂閱者,會自動設定為 true;針對非 SQL Server 訂閱者,會自動設定為 false。
[ @frequency_type=] frequency_type
這是散發工作的排程頻率。frequency_type 是 int,它可以是下列值之一。值 描述 1
一次
2
視需要
4
每日
8
每週
16
每月
32
每月相對
64 (預設值)
自動啟動
128
重複執行
- [ @frequency_interval=] frequency_interval
這是 frequency_type 設定的頻率所套用的值。frequency_interval 是 int,預設值是 NULL。
[ @frequency_relative_interval=] frequency_relative_interval
這是散發代理程式的日期。當 frequency_type 設定為 32 (每月相對) 時,則使用這個參數。frequency_relative_interval 是 int,它可以是下列值之一。值 描述 1
第一個
2
第二個
4
第三個
8
第四個
16
最後一個
NULL (預設值)
- [ @frequency_recurrence_factor=] frequency_recurrence_factor
這是 frequency_type 所用的循環因數。frequency_recurrence_factor 是 int,預設值是 NULL。
[ @frequency_subday=] frequency_subday
在定義的期間內,重新排程的頻率 (以分鐘為單位)。frequency_subday 是 int,它可以是下列值之一。值 描述 1
一次
2
秒
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=] 'optional_command_line'
這是要執行的選擇性命令提示字元。optional_command_line 是 nvarchar(4000),預設值是 NULL。
- [ @reserved=] 'reserved'
僅供內部使用。
- [ @enabled_for_syncmgr=] 'enabled_for_syncmgr'
這是指是否能夠利用 Microsoft Windows Synchronization Manager 同步處理訂閱。enabled_for_syncmgr 是 nvarchar(5),預設值是 FALSE。如果是 false,便不用 Windows Synchronization Manager 來登錄訂閱。如果是 true,便用 Windows Synchronization Manager 來登錄訂閱,且不需要啟動 SQL Server Management Studio,就可以同步處理。不支援 Oracle 發行者使用這個值。
[ @offloadagent= ] 'remote_agent_activation'
指定可以從遠端啟動代理程式。remote_agent_activation 是 bit,預設值是 0。附註: 這個參數已被取代,維護它的目的,只是為了與舊版的指令碼相容。
- [ @offloadserver= ] 'remote_agent_server_name'
指定將用來遠端啟動之伺服器的網路名稱。remote_agent_server_name 是 sysname,預設值是 NULL。
- [ @dts_package_name= ] 'dts_package_name'
指定 Data Transformation Services (DTS) 封裝的名稱。dts_package_name 是 sysname,預設值是 NULL。例如,若要指定 DTSPub_Package 封裝,這個參數便是@dts_package_name = N'DTSPub_Package'
。發送訂閱可以使用這個參數。若要將 DTS 封裝資訊加入提取訂閱中,請使用 sp_addpullsubscription_agent。
[ @dts_package_password= ] 'dts_package_password'
指定封裝的密碼 (如果有的話)。dts_package_password 是 sysname,預設值是 NULL。附註: 如果指定了 dts_package_name,則必須指定密碼。
- [ @dts_package_location= ] 'dts_package_location'
指定封裝位置。dts_package_location 是 nvarchar(12),預設值是 DISTRIBUTOR。封裝位置可以是散發者或訂閱者。
- [ @distribution_job_name= ] 'distribution_job_name'
僅供內部使用。
[ @publisher= ] 'publisher'
指定非 Microsoft SQL Server 發行者。publisher 是 sysname,預設值是 NULL。附註: SQL Server 發行者不應指定 publisher。
[ @backupdevicetype= ] 'backupdevicetype'
指定從備份中初始化訂閱者時,所用的備份裝置類型。backupdevicetype 是 nvarchar(20),它可以是下列值之一:值 描述 logical (預設值)
備份裝置是邏輯裝置。
disk
備份裝置是硬碟。
tape
備份裝置是磁帶機。
只有在 sync_method 設定為 initialize_with_backup 時,才使用 backupdevicetype。
- [ @backupdevicename= ] 'backupdevicename'
指定從備份中初始化訂閱者時,所用的裝置名稱。backupdevicename 是 nvarchar(1000),預設值是 NULL。
- [ @mediapassword= ] 'mediapassword'
如果媒體格式化時設定了密碼,便指定媒體集的密碼。mediapassword 是 sysname,預設值是 NULL。
- [ @password= ] 'password'
如果建立備份時設定了密碼,便指定備份的密碼。password 是 sysname,預設值是 NULL。
- [ @fileidhint= ] fileidhint
識別要還原之備份組的序數值。fileidhint 是 int,預設值是 NULL。
- [ @unload= ] unload
指定在從備份初始化完成之後,是否應該卸載磁帶備份裝置。unload 是 bit,預設值是 1。1 指定應該卸載磁帶。只有在 backupdevicetype 是 tape 時,才使用 unload。
- [ @subscriptionlsn= ] subscriptionlsn
僅供內部使用。
- [ @subscriptionstreams= ] subscriptionstreams
這是在維護許多使用單一執行緒時所提供的交易式性質時,每個散發代理程式可用來將變更批次並行套用在訂閱者上的連接數目。subscriptionstreams 是 tinyint,預設值是 NULL。支援的值範圍是 1-64。不支援非 SQL Server 訂閱者、Oracle 發行者或點對點訂閱使用這個參數。
[ @subscriber_type=] subscriber_type
這是訂閱者的類型。subscriber_type 是 tinyint 它可以是下列值之一。值 描述 0 (預設值)
SQL Server 訂閱者
1
ODBC 資料來源伺服器
2
Microsoft Jet 資料庫
3
OLE DB 提供者
傳回碼值
0 (成功) 或 1 (失敗)
備註
sp_addsubscription 用於快照式複寫和交易式複寫中。
當系統管理員 (sysadmin) 固定伺服器角色的成員執行 sp_addsubscription 來建立發送訂閱時,會隱含地建立散發代理程式作業,且會利用 SQL Server Agent 服務帳戶來執行這項作業。我們建議您執行 sp_addpushsubscription_agent,以及在 @job_login 和 @job_password 中指定特定代理程式專用的不同 Windows 帳戶的認證。如需詳細資訊,請參閱<複寫代理程式安全性模型>。
sp_addsubscription 可防止 ODBC 和 OLE DB 訂閱者存取符合下列狀況的發行集:
- 在呼叫 sp_addpublication 時,利用原生 sync_method 來建立。
- 包含利用 pre_creation_cmd 參數值是 3 (截斷) 的 sp_addarticle 預存程序加入發行集的發行項。
- 試圖將 update_mode 設為 sync tran。
- 有設定成使用參數化陳述式的發行項。
另外,如果發行集將 allow_queued_tran 選項設為 true (啟用訂閱者的變更默認,直到能夠在資料行套用為止),發行項中的時間戳記資料行便會編寫成 timestamp,這個資料行的變更會傳給訂閱者。訂閱者會產生和更新時間戳記資料行值。對於 ODBC 或 OLE DB 訂閱者而言,如果試圖訂閱 allow_queued_tran 設為 true 的發行集及含有時間戳記資料行的發行項,sp_addsubscription 便會失敗。
如果訂閱並未使用 DTS 封裝,它便不能訂閱設為 allow_transformable_subscriptions 的發行集。如果發行集的資料表必須複寫到 DTS 訂閱和非 DTS 訂閱,則必須建立兩個個別的發行集,每個訂閱類型各一個發行集。
權限
只有系統管理員 (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'AdventureWorksReplica';
--Add a push subscription to a transactional publication.
USE [AdventureWorks]
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
請參閱
參考
sp_addpushsubscription_agent (Transact-SQL)
sp_changesubstatus (Transact-SQL)
sp_dropsubscription (Transact-SQL)
sp_helpsubscription (Transact-SQL)
系統預存程序 (Transact-SQL)
其他資源
如何:建立發送訂閱 (複寫 Transact-SQL 程式設計)
How to: Create a Subscription for a Non-SQL Server Subscriber (Replication Transact-SQL Programming)
訂閱發行集