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


sp_addsubscription (Transact-SQL)

Область применения: SQL Server База данных SQL Azure

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

Соглашения о синтаксисе 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подписка добавляется ко всем статьям в этой публикации. Только значения all или NULL поддерживаются для издателей Oracle.

[ @subscriber = ] N'подписчик'

Имя подписчика. @subscriber — sysname с значением по умолчаниюNULL.

Примечание.

Имя сервера можно указать как <Hostname>,<PortNumber> для экземпляра по умолчанию или <Hostname>\<InstanceName>,<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) и может быть одним из следующих значений:

значение Описание
none 1 Подписчик уже имеет схему и начальные данные для опубликованных таблиц.
automatic (по умолчанию) Схема и начальные данные для опубликованных таблиц вначале передаются подписчику.
replication support only 2 Предоставляет автоматическое создание на подписчике статьи хранимой процедуры и триггеров, которые поддерживают обновляемые подписки, если это подходит. Предполагает, что подписчик уже имеет схему и начальные данные для опубликованных таблиц. При настройке топологии одноранговой репликации транзакций убедитесь, что данные во всех узлах топологии идентичны. Дополнительные сведения см. в разделе одноранговая репликация транзакций.
initialize with backup 2 Схема и начальные данные для опубликованных таблиц извлекаются из резервной копии базы данных публикации. Предполагает, что подписчик имеет доступ к резервной копии базы данных публикации. Расположение резервного копирования и типа носителя для резервной копии указывается @backupdevicename и @backupdevicetype. При использовании этого аргумента топология одноранговой репликации транзакций должна быть зафиксирована во время настройки.
initialize from lsn Используется при добавлении узла в топологию одноранговой репликации транзакций. Используется с @subscriptionlsn, чтобы убедиться в том, что все нужные транзакции реплецированы на новый узел. Предполагает, что подписчик уже имеет схему и начальные данные для опубликованных таблиц. Дополнительные сведения см. в разделе одноранговая репликация транзакций.

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

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

Примечание.

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

[ @status = ] N'status'

Состояние подписки. @status — sysname с значением по умолчаниюNULL. Если этот параметр не задан явным образом, репликация автоматически устанавливает его в одно из этих значений.

значение Описание
active Подписка инициализирована и готова к принятию изменений. Этот параметр устанавливается, если значение @sync_type отсутствует, инициализируется только с поддержкой резервного копирования или репликации.
subscribed Требуется инициализация подписки. Этот параметр устанавливается при автоматическом значении @sync_type .

[ @subscription_type = ] N'subscription_type'

Тип подписки. @subscription_type — nvarchar(4) с значением по умолчаниюpush. Может иметь значение push или pull. Агент распространения push-подписок находятся на распространителю, а агент распространения подписки на вытягивание находятся на подписчике. @subscription_type можно pull создать именованную подписку на вытягивание, которая известна издателю. Дополнительные сведения см. в статье Подписка на публикации.

Примечание.

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

[ @update_mode = ] N'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 = ] N'loopback_detection'

Определяет, отправляет ли агент распространителя транзакции, изначально созданные на подписчике, обратно подписчику. @loopback_detection — nvarchar(5) и может быть одним из этих значений.

значение Описание
true агент распространения не отправляет транзакции, поступающие на подписчик обратно на подписчик. Используется с двунаправленной репликацией транзакций. Дополнительные сведения см. в статье Bidirectional Transactional Replication.
false Агент распространителя отправляет транзакции, изначально созданные у подписчика, обратно.
NULL (по умолчанию) Автоматически устанавливается значение true для подписчика SQL Server и false для подписчика, отличного от SQL Server.

[ @frequency_type = ] frequency_type

Частота планирования задачи распространения. @frequency_type является int и может быть одним из этих значений.

значение Описание
1 Один раз.
2 по запросу
4 Ежедневно
8 Weekly (Еженедельно);
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 First
2 Second
4 Третья
8 Четвертая
16 Last
NULL (по умолчанию)

[ @frequency_recurrence_factor = ] frequency_recurrence_factor

Коэффициент повторения, используемый @frequency_type. @frequency_recurrence_factor имеет значение int с значением по умолчаниюNULL.

[ @frequency_subday = ] frequency_subday

Как часто, в минутах, перепланировать его в течение определенного периода. @frequency_subday является int и может быть одним из этих значений.

значение Описание
1 Однократно
2 Second
4 Minute
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) с значением по умолчанию, которое совпадает с значением falseпо умолчаниюNULL. Если falseподписка не зарегистрирована в диспетчере синхронизации Windows. Если trueподписка зарегистрирована в диспетчере синхронизации Windows и может быть синхронизирована без запуска SQL Server Management Studio. Не поддерживается для издателей Oracle.

[ @offloadagent = ] offloadagent

Указывает на то, что агент может быть активирован удаленно. @offloadagent бит с значением по умолчанию0.

Примечание.

Этот аргумент является устаревшим и сохраняется только для поддержки обратной совместимости скриптов.

[ @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.

Примечание.

Если указан @dts_package_name, необходимо указать пароль.

[ @dts_package_location = ] N'dts_package_location'

Указывает местоположение пакета. @dts_package_location — nvarchar(12), с значением по умолчанию, которое совпадает с значением distributorпо умолчаниюNULL. Расположение пакета может быть distributor или subscriber.

[ @distribution_job_name = ] N'distribution_job_name'

Указано только в ознакомительных целях. Не поддерживается. Совместимость с будущими версиями не гарантируется.

[ @publisher = ] N'publisher'

Указывает издатель, отличный от SQL Server. @publisher — sysname с значением по умолчаниюNULL.

Примечание.

@publisher не следует указывать для издателя SQL Server.

[ @backupdevicetype = ] N'backupdevicetype'

Задает тип устройства резервного копирования, используемого при инициализации подписчика из резервной копии. @backupdevicetype — nvarchar(20) и может быть одним из следующих значений:

значение Описание
logical (по умолчанию) Устройство резервного копирования — это логическое устройство
disk Устройство резервного копирования — диск
tape Устройство резервного копирования является накопителем на магнитной ленте.
url Устройство резервного копирования — это URL-адрес

@backupdevicetype используется только в том случае, если для @sync_method задано значение initialize_with_backup.

[ @backupdevicename = ] N'backupdevicename'

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

[ @mediapassword = ] N'mediapassword'

Указывает пароль для набора носителей, если при форматировании носителя был задан пароль. @mediapassword — sysname с значением по умолчаниюNULL.

Примечание.

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

[ @password = ] N'password'

Указывает пароль для резервной копии, если при создании резервной копии был задан пароль. @password — sysname с значением по умолчаниюNULL.

[ @fileidhint = ] fileidhint

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

[ @unload = ] выгрузка

Определяет, должно ли быть выгружено ленточное устройство резервного копирования после завершения инициализации из резервной копии. @unload имеет значение по умолчанию1, указывающее, что лента должна быть выгружена. @unload используется только в том случае, если @backupdevicetypetape.

[ @subscriptionlsn = ] subscriptionlsn

Задает регистрационный номер транзакции в журнале (LSN), начиная с которого подписка должна доставлять изменения на узел в одноранговой топологии репликации транзакций. @subscriptionlsn — binary(10), с значением по умолчаниюNULL. Используется с @sync_type значением initialize from lsn , чтобы убедиться, что все соответствующие транзакции реплицируются на новый узел. Дополнительные сведения см. в разделе одноранговая репликация транзакций.

[ @subscriptionstreams = ] подписок

Количество подключений, разрешенных для каждого агент распространения применять пакеты изменений параллельно подписчику, сохраняя при использовании одного потока множество характеристик транзакций. @subscriptionstreams крошечный, с по умолчанию NULL. Поддерживается диапазон значений от 1 до 64 . Этот параметр не поддерживается для подписчиков, отличных от SQL Server, издателей Oracle или одноранговых подписок. Каждый раз, когда используется @subscriptionstreams, в таблицу добавляются msreplication_subscriptions дополнительные строки (одна строка на поток) с набором agent_id NULL.

Примечание.

Потоки подписок не работают для статей, настроенных для доставки Transact-SQL. Чтобы использовать потоки подписок, настройте статьи для доставки вызовов хранимой процедуры.

[ @subscriber_type = ] subscriber_type

Тип подписчика. @subscriber_type крошечный и может быть одним из этих значений.

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

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

sp_addsubscription Запрещает подписчикам ODBC и OLE DB доступ к публикациям, которые:

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

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

При выборе sync_type параметров replication support onlyinitialize with backupили initialize from lsnагента чтения журналов необходимо запустить после выполненияsp_addsubscription, чтобы скрипты настройки записылись в базу данных распространителя. Агент чтения журнала должен работать под учетной записью, которая является членом предопределенной роли сервера 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