Поделиться через


sp_addsubscription (Transact-SQL)

Добавляет подписку публикации и устанавливает состояние подписчика. Эта хранимая процедура выполняется в базе данных публикации на издателе.

Значок ссылки на разделСинтаксические обозначения в 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) и может принимать одно из следующих значений.

    Максимальное значение

    Описание

    none

    Подписчик уже имеет схему и начальные данные для опубликованных таблиц.

    ПримечаниеПримечание
    Этот аргумент является устаревшим. Вместо этого используйте значение «replication support only».

    automatic (по умолчанию)

    Схема и начальные данные для опубликованных таблиц передаются сначала подписчику.

    replication support only

    Предоставляет автоматическое создание на подписчике статьи хранимой процедуры и триггеров, которые поддерживают обновляемые подписки, если это подходит. Предполагает, что подписчик уже имеет схему и начальные данные для опубликованных таблиц. При настройке одноранговой топологии репликации транзакций убедитесь, что данные во всех узлах топологии идентичны. Дополнительные сведения см. в разделе Как настроить одноранговую репликацию транзакций (программирование репликации на языке Transact-SQL).

    Не поддерживается для подписок на публикации, отличные от SQL Server.

    initialize with backup

    Схема и начальные данные для опубликованных таблиц извлекаются из резервной копии базы данных публикации. Предполагает, что подписчик имеет доступ к резервной копии базы данных публикации. Местоположение резервной копии и тип носителя для резервной копии указаны в backupdevicename и backupdevicetype. При использовании этого аргумента одноранговая топология репликации транзакций должна быть зафиксирована во время настройки.

    Не поддерживается для подписок на публикации, отличные от SQL Server.

    initialize from lsn

    Используется при добавлении узла к топологии одноранговой репликации транзакций. Чтобы убедиться в том, что с новым узлом реплицированы все нужные транзакции, используется значение @subscriptionlsn. Предполагает, что подписчик уже имеет схему и начальные данные для опубликованных таблиц. Дополнительные сведения см. в разделе Как настроить одноранговую репликацию транзакций (программирование репликации на языке Transact-SQL).

    ПримечаниеПримечание

    Системные таблицы и данные переносятся всегда.

  • [ @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. Агенты распространителя принудительных подписок находятся на распространителе, а агенты распространителя подписок по запросу — на подписчике. Аргумент subscription_type может принимать значение pull для создания именованной подписки по запросу, известной издателю. Дополнительные сведения см. в разделе Подписка на публикации.

    ПримечаниеПримечание

    Анонимные подписки не нуждаются в использовании этой хранимой процедуры.

  • [ @update_mode=\] 'update_mode'
    Тип обновления. Аргумент update_mode имеет тип nvarchar(30) и может принимать одно из следующих значений.

    Максимальное значение

    Описание

    read only (по умолчанию)

    Подписка только для чтения. Изменения у подписчика не отправляются издателю.

    sync tran

    Включает поддержку немедленно обновляемых подписок. Не поддерживается для издателей Oracle.

    queued tran

    Обеспечивает подписку на обновление по очереди. Изменение данных можно выполнять у подписчика, сохранять в очереди и после этого передавать издателю. Не поддерживается для издателей Oracle.

    failover

    Включает для подписки немедленное обновление с обновлением по очереди при переходе на другой ресурс в случае сбоя. Изменение данных можно выполнять у подписчика и немедленно передавать издателю. Если издатель и подписчик не подключены, режим обновления может быть изменен так, что изменения данных, сделанные у подписчика, будут сохраняться в очереди до тех пор, пока подписчик и издатель не будут повторно подключены. Не поддерживается для издателей Oracle.

    queued failover

    Включает подписку с обновлением по очереди в качестве обновляемой по очереди подписки, при этом поддерживает возможность переключения в режим немедленного обновления. Изменение данных можно выполнять у подписчика и сохранять в очереди до установления соединения между подписчиком и издателем. При установлении постоянного соединения можно переключиться в режим немедленного обновления. Не поддерживается для издателей Oracle.

    Обратите внимание, что значения sync tran и queued tran недопустимы, если публикация, на которую выполняется подписка, разрешает использование служб DTS.

  • [ @loopback_detection=\] 'loopback_detection'
    Определяет, отправляет ли агент распространителя транзакции, изначально созданные на подписчике, обратно подписчику. Аргумент loopback_detection имеет тип nvarchar(5) и может принимать одно из следующих значений.

    Максимальное значение

    Описание

    true

    Агент распространителя не отправляет транзакции, изначально созданные у подписчика, обратно. Используется с двунаправленной репликацией транзакций. Дополнительные сведения см. в разделе Двунаправленная репликация транзакций.

    false

    Агент распространителя отправляет транзакции, изначально созданные у подписчика, обратно.

    NULL (по умолчанию)

    Автоматически устанавливается значение true для подписчика SQL Server и значение false для подписчика, не относящегося к SQL Server.

  • [ @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
    Время суток, на которое назначен первый запуск агента распространителя, в формате «ЧЧММСС». Аргумент active_start_time_of_day имеет тип int и значение по умолчанию NULL.

  • [ @active_end_time_of_day=\] active_end_time_of_day
    Время плановой остановки агента распространителя в формате «ЧЧММСС». Аргумент active_end_time_of_day имеет тип int и значение по умолчанию NULL.

  • [ @active_start_date=\] active_start_date
    Дата первого планового запуска агента распространителя в формате «ГГГГММДД». Аргумент active_start_date имеет тип int и значение по умолчанию NULL.

  • [ @active_end_date=\] active_end_date
    Дата плановой остановки агента распространителя в формате «ГГГГММДД». Аргумент 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. Аргумент enabled_for_syncmgr имеет тип nvarchar(5) и значение по умолчанию FALSE. Если это значение равно FALSE, подписка не регистрируется диспетчером синхронизации Windows. Если значение равно TRUE, подписка регистрируется диспетчером синхронизации Windows и может быть синхронизирована без запуска среды Среда 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'
    Задает имя пакета службы 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.

    ПримечаниеПримечание

    Аргумент publisher не должен быть определен для издателя SQL Server.

  • [ @backupdevicetype= ] 'backupdevicetype'
    Задает тип устройства резервного копирования, используемого при инициализации подписчика из резервной копии. Аргумент backupdevicetype имеет тип nvarchar(20) и может принимать одно из следующих значений.

    Максимальное значение

    Описание

    logical (по умолчанию)

    Устройство резервного копирования является логическим устройством.

    disk

    Устройство резервного копирования является жестким диском.

    tape

    Устройство резервного копирования является накопителем на магнитной ленте.

    Параметр backupdevicetype используется, только если аргумент sync_method имеет значение initialize_with_backup.

  • [ @backupdevicename= ] 'backupdevicename'
    Указывает имя устройства, используемого при инициализации подписчика из резервной копии. Аргумент backupdevicename имеет тип nvarchar(1000) и значение по умолчанию NULL.

  • [ @mediapassword= ] 'mediapassword'
    Указывает пароль для набора носителей, если при форматировании носителя был задан пароль. Аргумент mediapassword имеет тип sysname и значение по умолчанию NULL.

    ПримечаниеПримечание

    В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

  • [ @password= ] 'password'
    Указывает пароль для резервной копии, если при создании резервной копии был задан пароль. Аргумент password имеет тип sysname и значение по умолчанию NULL.

  • [ @fileidhint= ] fileidhint
    Определяет порядковый номер восстанавливаемого резервного набора данных. Аргумент fileidhint имеет тип int и значение по умолчанию NULL.

  • [ @unload= ] unload
    Определяет, должно ли быть выгружено ленточное устройство резервного копирования после завершения инициализации из резервной копии. Аргумент unload имеет тип bit и значение по умолчанию 1, означающее, что ленточное устройство должно быть выгружено. Аргумент unload используется только в том случае, если аргумент backupdevicetype установлен в значение tape.

  • [ @subscriptionlsn= ] subscriptionlsn
    Задает регистрационный номер транзакции в журнале (LSN), начиная с которого подписка должна доставлять изменения на узел в одноранговой топологии репликации транзакций. Для уверенности в том, что на новый узел реплицированы все нужные транзакции, используйте в качестве аргумента @subscriptionlsn начальное значение lsn. Дополнительные сведения см. в разделе Как настроить одноранговую репликацию транзакций (программирование репликации на языке Transact-SQL).

  • [ @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 используется в репликации моментальных снимков и репликации транзакций.

При выполнении процедуры sp_addsubscription членом предопределенной роли сервера sysadmin для создания принудительной подписки задание агента распространителя явно создается и запускается под учетной записью службы агента SQL Server. Рекомендуется выполнять процедуру sp_addpushsubscription_agent, указывая в качестве аргументов @job_login и @job_password учетные данные другой, определенной для агента, учетной записи Windows. Дополнительные сведения см. в разделе Модель безопасности агента репликации.

Процедура sp_addsubscription закрывает доступ для подписчиков ODBC и OLE DB к следующим публикациям.

  • Созданным с помощью собственного метода sync_method при вызове процедуры sp_addpublication.

  • Содержащим статьи, добавленные к публикации с помощью хранимой процедуры sp_addarticle, значение аргумента pre_creation_cmd которой равнялось 3 (усечение).

  • Пытающимся присвоить аргументу update_mode значение sync tran.

  • Имеющим статью, настроенную на использование параметризованных инструкций.

Кроме того, если аргумент allow_queued_tran публикации имеет значение true (что разрешает постановку изменений в очередь на подписчике до тех пор, пока они не будут выполнены на издателе), столбец временных меток в статье записывается в сценарий с типом timestamp, и изменения этого столбца отправляются подписчику. Подписчик формирует и обновляет значение столбца временной метки. Для подписчика ODBC или OLE DB процедура sp_addsubscription завершается неудачей, если попытка проводилась с целью подписаться на публикацию, у которой аргумент allow_queued_tran равен true и имеются статьи со столбцами временных меток.

Если подписка не использует пакет служб DTS, она не может подписаться на публикацию с аргументом allow_transformable_subscriptions. Если таблицу из публикации нужно реплицировать как в подписку служб DTS, так и в подписку, отличную от подписки служб DTS, необходимо создать две разные публикации: одну для каждого типа подписки.

Пример

-- 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'AdventureWorks2008R2Replica';

--Add a push subscription to a transactional publication.
USE [AdventureWorks2008R2]
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_addsubscription могут выполнять только члены предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner. Для подписок по запросу пользователи, имеющие имена входа в списке доступа к публикации, могут выполнять процедуру sp_addsubscription.