Replication System Stored Procedures Concepts

В SQL Server программный доступ ко всем настраиваемым пользователями функциональным возможностям в топологии репликации предоставляется системными хранимыми процедурами. Хотя хранимые процедуры могут выполняться по отдельности с помощью SQL Server Management Studio или программы командной строки sqlcmd, может оказаться полезным записать файлы скриптов Transact-SQL, которые можно выполнить для выполнения логической последовательности задач репликации.

Задачи репликации со сценарной поддержкой предоставляют следующие преимущества:

  • Сохраняется постоянная копия шагов, выполненных при развертывании топологии репликации.

  • Используется единственный скрипт для настройки нескольких подписчиков.

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

    Важно!

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

Создание скриптов репликации

С точки зрения репликации скрипт представляет собой серию из одной или нескольких инструкций Transact-SQL, где каждая инструкция выполняет хранимую процедуру репликации. Скрипты — это текстовые файлы, часто имеющие такое расширение файла, как SQL, которые могут быть вызваны на выполнение с помощью программы sqlcmd. После вызова файла скрипта эта программа выполняет инструкции SQL, хранящиеся в файле. Аналогичным образом скрипт может храниться как объект запроса в проекте среды SQL Server Management Studio.

Для создания скриптов репликации могут применяться следующие способы.

  • Создание скрипта вручную.

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

  • SQL Server Management Studio. Дополнительные сведения см. в разделе Scripting Replication.

  • использование объектов RMO для формирования программным путем скрипта создания объекта RMO.

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

  • Скрипты Transact-SQL имеют один или несколько пакетов. Команда GO означает конец пакета. Если скрипт Transact-SQL не содержит команд GO, он выполняется как один пакет.

  • Если в одном пакете должно быть выполнено несколько хранимых процедур репликации, то после первой процедуры все последующие процедуры в пакете должны быть указаны с предшествующим ключевым словом EXECUTE.

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

  • Если скрипты создаются для настройки конфигурации репликации, то должна использоваться проверка подлинности Windows для исключения необходимости хранить учетные данные безопасности в файле скрипта. В случае необходимости хранения учетных данных в файле скрипта этот файл следует защищать во избежание несанкционированного доступа.

Образец скрипта репликации

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

-- 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".  
  
-- Install the Distributor and the distribution database.  
DECLARE @distributor AS sysname;  
DECLARE @distributionDB AS sysname;  
DECLARE @publisher AS sysname;  
DECLARE @directory AS nvarchar(500);  
DECLARE @publicationDB AS sysname;  
-- Specify the Distributor name.  
SET @distributor = $(DistPubServer);  
-- Specify the distribution database.  
SET @distributionDB = N'distribution';  
-- Specify the Publisher name.  
SET @publisher = $(DistPubServer);  
-- Specify the replication working directory.  
SET @directory = N'\\' + $(DistPubServer) + '\repldata';  
-- Specify the publication database.  
SET @publicationDB = N'AdventureWorks2012';   
  
-- Install the server MYDISTPUB as a Distributor using the defaults,  
-- including autogenerating the distributor password.  
USE master  
EXEC sp_adddistributor @distributor = @distributor;  
  
-- Create a new distribution database using the defaults, including  
-- using Windows Authentication.  
USE master  
EXEC sp_adddistributiondb @database = @distributionDB,   
    @security_mode = 1;  
GO  
  
-- Create a Publisher and enable AdventureWorks2012 for replication.  
-- Add MYDISTPUB as a publisher with MYDISTPUB as a local distributor  
-- and use Windows Authentication.  
DECLARE @distributionDB AS sysname;  
DECLARE @publisher AS sysname;  
-- Specify the distribution database.  
SET @distributionDB = N'distribution';  
-- Specify the Publisher name.  
SET @publisher = $(DistPubServer);  
  
USE [distribution]  
EXEC sp_adddistpublisher @publisher=@publisher,   
    @distribution_db=@distributionDB,   
    @security_mode = 1;  
GO  
  

Затем этот скрипт может быть сохранен локально в качестве instdistpub.sql, чтобы его можно было выполнить один или несколько раз, если это потребуется.

Предыдущий скрипт включает переменные скрипта sqlcmd, которые используются во многих примерах кода репликации в электронной документации по SQL Server. Переменные скрипта определяются с использованием синтаксиса $(MyVariable). Значения переменных могут быть переданы в скрипт в командной строке или в среде SQL Server Management Studio. Дополнительные сведения см. в следующем подразделе данного раздела, «Выполнение скриптов репликации».

Выполнение скриптов репликации

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

Создание файла SQL-запроса в среде SQL Server Management Studio

Файл скрипта Transact-SQL репликации можно создать в виде файла SQL-запроса в проекте SQL Server Management Studio. После записи скрипта может быть создано соединение с базой данных для этого файла запроса и скрипт вызван на выполнение. Дополнительные сведения о создании скриптов Transact-SQL с помощью SQL Server Management Studio см. в разделе Редакторы запросов и текста (SQL Server Management Studio)).

Чтобы использовать скрипт с переменными скрипта, необходимо запустить среду SQL Server Management Studio в режиме sqlcmd. В режиме sqlcmd редактор запросов распознает дополнительный синтаксис, характерный для sqlcmd, например обозначение :setvar для значений переменных. Дополнительные сведения о режиме sqlcmd см. в разделе об изменении скриптов SQLCMD при помощи редактора запросов. В следующем скрипте :setvar используется для предоставления значения переменной $(DistPubServer).

:setvar DistPubServer N'MyPublisherAndDistributor';  
  
-- Install the Distributor and the distribution database.  
DECLARE @distributor AS sysname;  
DECLARE @distributionDB AS sysname;  
DECLARE @publisher AS sysname;  
DECLARE @directory AS nvarchar(500);  
DECLARE @publicationDB AS sysname;  
-- Specify the Distributor name.  
SET @distributor = $(DistPubServer);  
-- Specify the distribution database.  
SET @distributionDB = N'distribution';  
-- Specify the Publisher name.  
SET @publisher = $(DistPubServer);  
  
--  
-- Additional code goes here  
--  

Использование программы sqlcmd в командной строке

Следующий пример показывает, как выполнить файл скрипта instdistpub.sql из командной строки с применением программы sqlcmd:

sqlcmd.exe -E -S sqlserverinstance -i C:\instdistpub.sql -o C:\output.log -v DistPubServer="N'MyDistributorAndPublisher'"  

В этом примере параметр -E указывает, что используется проверка подлинности Windows при соединении с SQL Server. Если используется проверка подлинности Windows, то отсутствует необходимость хранить имя пользователя и пароль в файле скрипта. Имя и путь к файлу скрипта задаются параметром -i, а имя выходного файла — параметром -o (если используется этот параметр, то вывод программы SQL Server записывается в указанный файл, а не на консоль). Служебная sqlcmd программа позволяет передавать переменные скрипта в скрипт Transact-SQL во время выполнения с помощью -v параметра . В этом примере программа sqlcmd заменяет каждое вхождение переменной $(DistPubServer) в скрипте значением N'MyDistributorAndPublisher' перед выполнением.

Примечание

Параметр -X позволяет запретить использование переменных сценария.

Автоматизация задач с применением пакетного файла

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

REM ----------------------Script to synchronize merge subscription ----------------------  
REM -- Creates subscription database and   
REM -- synchronizes the subscription to MergeSalesPerson.  
REM -- Current computer acts as both Publisher and Subscriber.  
REM -------------------------------------------------------------------------------------  
  
SET Publisher=%computername%  
SET Subscriber=%computername%  
SET PubDb=AdventureWorks  
SET SubDb=AdventureWorksReplica  
SET PubName=AdvWorksSalesOrdersMerge  
  
REM -- Drop and recreate the subscription database at the Subscriber  
sqlcmd /S%Subscriber% /E /Q"USE master IF EXISTS (SELECT * FROM sysdatabases WHERE name='%SubDb%' ) DROP DATABASE %SubDb%"  
sqlcmd /S%Subscriber% /E /Q"USE master CREATE DATABASE %SubDb%"  
  
REM -- Add a pull subscription at the Subscriber  
sqlcmd /S%Subscriber% /E /Q"USE %SubDb% EXEC sp_addmergepullsubscription @publisher = %Publisher%, @publication = %PubName%, @publisher_db = %PubDb%"  
sqlcmd /S%Subscriber% /E /Q"USE %SubDb%  EXEC sp_addmergepullsubscription_agent @publisher = %Publisher%, @publisher_db = %PubDb%, @publication = %PubName%, @subscriber = %Subscriber%, @subscriber_db = %SubDb%, @distributor = %Publisher%"  
  
REM -- This batch file starts the merge agent at the Subscriber to   
REM -- synchronize a pull subscription to a merge publication.  
REM -- The following must be supplied on one line.  
"\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE"  -Publisher  %Publisher% -Subscriber  %Subscriber%  -Distributor %Publisher%  -PublisherDB  %PubDb% -SubscriberDB %SubDb% -Publication %PubName% -PublisherSecurityMode 1 -OutputVerboseLevel 1  -Output  -SubscriberSecurityMode 1  -SubscriptionType 1 -DistributorSecurityMode 1 -Validate 3  
  

Сценарная поддержка общих задач репликации

Ниже перечислены некоторые из наиболее распространенных задач репликации, которые могут быть реализованы в виде сценариев с использованием системных хранимых процедур:

  • Настройка публикации и распределения

  • Изменение свойств издателя и распространителя

  • Отключение публикации и распространения

  • Создание публикаций и определение статей

  • Удаление публикаций и статей

  • Создание подписки по запросу

  • Изменение подписки по запросу

  • Удаление подписки по запросу

  • Создание принудительной подписки

  • Изменение принудительной подписки

  • Удаление принудительной подписки

  • Синхронизация подписки по запросу

См. также

Основные понятия программирования репликации
Хранимые процедуры репликации (Transact-SQL)
Создание скриптов репликации