Создание и применение исходного моментального снимка
Область применения: SQL Server Управляемый экземпляр SQL Azure
В этом разделе описывается создание и применение начального моментального снимка в SQL Server с помощью SQL Server Management Studio, Transact-SQL или объектов управления репликацией (RMO). Публикации слиянием, использующие параметризованные фильтры, требуют моментальных снимков, состоящих из двух частей. Дополнительные сведения см. в статье Создание моментального снимка для публикации слиянием с параметризованными фильтрами.
Моментальные снимки создаются агентом моментальных снимков после создания публикации. Моментальные снимки могут создаваться:
- Немедленно. По умолчанию моментальный снимок для публикации слиянием формируется немедленно после создания публикации в мастере создания публикаций.
- По расписанию. Расписание задается на странице Агент моментальных снимков мастера создания публикаций либо при использовании хранимых процедур или объектов RMO.
- Вручную. Запустите агент моментальных снимков из командной строки или из SQL Server Management Studio. Дополнительные сведения о выполнении агентов см. в разделе "Основные понятия агента репликации" и "Запуск и остановка агента репликации" (SQL Server Management Studio).
Для репликации слиянием моментальный снимок формируется при каждом запуске агента моментальных снимков. Для репликации транзакций формирование моментального снимка зависит от настроек свойства публикации immediate_sync. Если значение свойства установлено в TRUE (значение по умолчанию при использовании мастера создания публикаций), моментальный снимок создается при каждом запуске агента моментальных снимков и может быть применен к подписчику в любое время. Если значение свойства установлено в FALSE (значение по умолчанию при использовании хранимой процедуры sp_addpublication), моментальный снимок создается только в том случае, если после запуска агента моментальных снимков была добавлена новая подписка. Для проведения синхронизации подписчики должны ждать завершения работы агента моментальных снимков.
Когда создаются моментальные снимки, они сохраняются по умолчанию в стандартной папке моментальных снимков, расположенной на распространителе. Файлы моментальных снимков можно также сохранить на сменных носителях, например на сменных дисках, компакт-дисках или в местоположениях, отличных от папки моментальных снимков по умолчанию. Кроме этого, эти файлы можно сжимать для облегчения их хранения и передачи, а также выполнять скрипты до или после применения моментального снимка на подписчике. Дополнительные сведения об этих параметрах см. в разделе Snapshot Options.
Если требуется моментальный снимок для публикации слиянием, в которой используются параметризованные фильтры, процесс создания моментального снимка происходит в два этапа. Сначала создается моментальный снимок схемы, который содержит скрипты репликации и схему публикуемых объектов, но не содержит данные. Потом каждая подписка инициализируется при помощи моментального снимка, который содержит скрипты и схему, скопированную из моментального снимка схемы, и данные, которые принадлежат секции подписки. Дополнительные сведения см. в статье Snapshots for Merge Publications with Parameterized Filters.
После того как моментальный снимок создан на издателе и сохранен в папке по умолчанию или в каком-либо другом местоположении, этот моментальный снимок можно передать подписчику и применить. Агент распространителя (для репликации моментальных снимков или репликации транзакций) или агент слияния (для репликации слиянием) передает моментальный снимок и применяет файлы схемы и данных в базе данных подписки на подписчике во время выполнения первоначальной синхронизации. Если используется мастер создания подписки, первоначальная синхронизация происходит по умолчанию немедленно после создания подписки. Этот режим управляется параметром Инициализировать, когда на странице Инициализация подписок мастера. Когда моментальные снимки создаются после инициализации подписки, они не применяются на подписчике, если подписка не помечена для повторной инициализации. Дополнительные сведения см. в статье Повторная инициализация подписок.
После того, как агент распространителя или агент слияния применяет исходный моментальный снимок, агент распространяет последующие обновления и другие изменения данных. Когда моментальные снимки распространяются и применяются на подписчиках, воздействие оказывается только на подписчики, ожидающие исходные или новые моментальные снимки. Другие подписчики на данную публикацию (уже получающие вставки, обновления, удаления или другие изменения опубликованных данных) не подвергаются воздействию.
Чтобы просмотреть или изменить папку по умолчанию для моментального снимка, см.
SQL Server Management Studio: изменение параметров моментального снимка
Программирование репликации и RMO: Configure Publishing and Distribution
Расположение моментального снимка по умолчанию
Задайте местоположение моментальных снимков по умолчанию на странице Папка моментальных снимков мастера настройки распространителя. Дополнительные сведения см. в статье Настройка публикации и распространения. При создании публикации на сервере, не настроенном в качестве распространителя, задайте местоположение моментальных снимков по умолчанию на странице Папка моментальных снимков мастера создания публикаций. Дополнительные сведения об использовании мастера см. в статье Создание публикации.
Измените расположение моментального снимка по умолчанию на странице издателей диалогового окна "Свойства распространителя - <распространитель>". Дополнительные сведения см. в статье Просмотр и изменение свойств издателя и распространителя. Задайте папку моментального снимка для каждой публикации в диалоговом окне "Свойства публикации — <публикация> ". Дополнительные сведения см. в статье View and Modify Publication Properties.
Изменение местоположения моментальных снимков по умолчанию
На странице "Издатели" диалогового окна "Свойства распространителя - <распространитель>" нажмите кнопку свойств (...) для издателя, для которого требуется изменить расположение моментального снимка по умолчанию.
В диалоговом окне "Свойства издателя — <издатель>" введите значение свойства папки моментальных снимков по умолчанию.
Примечание.
Агент моментальных снимков должен иметь разрешения на запись в указанный каталог, а агент распространителя или агент слияния должен иметь разрешения на чтение из этого каталога. Если используются подписки по запросу, необходимо указать общий каталог как универсальный путь к именованию (UNC), например \\computername\snapshot. Дополнительные сведения см. в статье Организация безопасности папки моментальных снимков.
Нажмите ОК.
Создать моментальный снимок
По умолчанию, если выполняется агент SQL Server, агент моментальных снимков создает моментальный снимок сразу после того, как создана публикация с помощью мастера создания публикаций. Затем по умолчанию агент распространителя (для репликации моментальных снимков и репликации транзакций) или агент слияния (для подписок на публикацию слиянием) применяет моментальный снимок ко всем подпискам. Моментальный снимок также можно создать с помощью SQL Server Management Studio и монитора репликации. Сведения о запуске монитора репликации см. в этой статье.
Использование среды SQL Server Management Studio
- Подключитесь к издателю в Management Studio и разверните узел сервера.
- Раскройте папку Репликация , а затем папку Локальные публикации .
- Щелкните правой кнопкой мыши публикацию, для которой нужно создать моментальный снимок, а затем выберите Просмотреть состояние агента моментальных снимков.
- В диалоговом окне "Вид агент моментальных снимков состояние — <публикация>" нажмите кнопку "Пуск".
Когда агент моментальных снимков закончит создание моментального снимка, на экране появится сообщение: «[100%] Сформирован моментальный снимок 17 статей».
В мониторе репликации
- В мониторе репликации раскройте группу издателей на левой панели, а затем раскройте нужного издателя.
- Щелкните правой кнопкой мыши публикацию, для которой нужно создать моментальный снимок, и выберите Создать моментальный снимок.
- Чтобы просмотреть состояние агент моментальных снимков, перейдите на вкладку "Агенты". Дополнительные сведения щелкните правой кнопкой мыши агент моментальных снимков в сетке и выберите пункт "Просмотреть сведения".
Использование Transact-SQL
Исходные моментальные снимки можно создавать программно, создавая и запуская задания агента моментальных снимков либо запуская исполняемый файл агента моментальных снимков из пакетного файла. После создания исходный моментальный снимок передается на подписчик и применяется при первой синхронизации подписки. Если агент моментальных снимков запускается из командной строки или пакетного файла, потребуется повторно запустить агент, когда существующий моментальный снимок станет недействительным.
Внимание
По возможности предлагайте пользователям вводить учетные данные системы безопасности во время выполнения приложения. В случае необходимости хранения учетных данных в файле скрипта этот файл следует защищать во избежание несанкционированного доступа.
Создайте моментальный снимок, публикацию слиянием или публикацию транзакций. Дополнительные сведения см. в разделе Create a Publication.
Выполнение sp_addpublication_snapshot (Transact-SQL) Укажите параметр @publication и следующие параметры.
@job_login — указывает учетные данные для проверки подлинности Windows, под которыми запускается агент моментальных снимков на распространителе.
@job_password— является паролем для указанных учетных данных Windows.
(Необязательно) Значение 0 в параметре @publisher_security_mode , если агент при соединении с издателем будет использовать проверку подлинности SQL Server. В этом случае в параметрах @publisher_login и @publisher_passwordнужно также указать данные имени входа для проверки подлинности SQL Server.
(Необязательно) Расписание синхронизации для задания агента моментальных снимков. Дополнительные сведения см. в статье Specify Synchronization Schedules.
Внимание
Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).
Добавьте статьи к публикации. Дополнительные сведения см. в статье определить статью.
На издателе в базе данных публикации выполните sp_startpublication_snapshot (Transact-SQL), указав значение @publication на шаге 1.
Применение моментального снимка
Использование среды SQL Server Management Studio
После создания моментальный снимок применяется при синхронизации подписки с помощью агента распространителя или агента слияния:
- Если агент настроен для постоянной работы (выбор по умолчанию для репликации транзакций), моментальный снимок применяется автоматически после того, как он был создан.
- Если агент настроен для работы по расписанию, моментальный снимок применяется при следующем запланированном запуске агента.
- Если агент настроен для работы по запросу, моментальный снимок применяется при следующем запуске агента.
Дополнительные сведения о синхронизации подписок см. в разделах Synchronize a Push Subscription и Synchronize a Pull Subscription.
Использование Transact-SQL
Создайте моментальный снимок, публикацию слиянием или публикацию транзакций. Дополнительные сведения см. в разделе Create a Publication.
Добавьте статьи к публикации. Дополнительные сведения см. в статье определить статью.
Из командной строки или из пакетного файла запустите агент слияния репликации , вызвав программу snapshot.exeсо следующими параметрами командной строки.
- -Publication
- -Publisher
- -Distributor
- -PublisherDB
- -ReplicationType
При использовании проверки подлинности SQL Server необходимо также указать следующие аргументы.
- -DistributorLogin
- -DistributorPassword
- -DistributorSecurityMode = 0
- -PublisherLogin
- -PublisherPassword
- -PublisherSecurityMode = 0
Примеры (Transact-SQL)
В этом примере показано, как создавать публикации транзакций и добавлять задания агента моментальных снимков к новым публикациям (с помощью переменных скрипта sqlcmd ). В примере также запускается задание.
-- To avoid storing the login and password in the script file, the values
-- are passed into SQLCMD as scripting variables. 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 @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);
USE [AdventureWorks]
-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption
@dbname = @publicationDB,
@optname = N'publish',
@value = N'true';
-- Execute sp_addlogreader_agent to create the agent job.
EXEC sp_addlogreader_agent
@job_login = @login,
@job_password = @password,
-- Explicitly specify the security mode used when connecting to the Publisher.
@publisher_security_mode = 1;
-- Create new transactional publication, using the defaults.
USE [AdventureWorks2022]
EXEC sp_addpublication
@publication = @publication,
@description = N'transactional publication';
-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = @login,
@job_password = @password;
-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO
В этом примере создается публикация слиянием, к которой добавляется задание агента моментальных снимков (с помощью переменных sqlcmd ). В этом примере также запускается задание.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. 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 @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @login = $(Login);
SET @password = $(Password);
-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption
@dbname = @publicationDB,
@optname=N'merge publish',
@value = N'true';
-- Create new merge publication, using the defaults.
USE [AdventureWorks]
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication.';
-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = @login,
@job_password = @password;
-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO
Следующие параметры командной строки запускают агент моментальных снимков для формирования моментальных снимков для публикации слиянием.
Примечание.
Пример разбит на строки для удобства чтения. В пакетном файле команды необходимо вводить в одной строке.
REM -- Declare variables
SET Publisher=%InstanceName%
SET PublicationDB=AdventureWorks2022
SET Publication=AdvWorksSalesOrdersMerge
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1
При помощи объектов RMO
После создания публикации агент моментальных снимков создает моментальный снимок. Создание моментального снимка и прямой доступ из управляемого кода к функциям агента репликации могут производиться программным путем с помощью объектов RMO. Какие именно объекты при этом применяются, зависит от типа репликации. Агент моментальных снимков может быть запущен как синхронно с помощью объекта SnapshotGenerationAgent , так и в асинхронном режиме из задания агента. После создания исходного моментального снимка он передается на сервер подписчика и применяется при первом сеансе синхронизации подписки. Когда данные в существующем моментальном снимке устарели, соответствующий ему агент должен быть запущен повторно. Дополнительные сведения см. в статье Обслуживание публикаций.
Внимание
По возможности предлагайте пользователям вводить учетные данные системы безопасности во время выполнения приложения. Если необходимо сохранить учетные данные, используйте криптографические службы, предоставляемые microsoft Windows платформа .NET Framework.
Создание исходного моментального снимка для публикации транзакций или моментальных снимков из задания агента моментальных снимков (в асинхронном режиме)
Создайте соединение с издателем с помощью класса ServerConnection .
Создайте экземпляр класса TransPublication. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.
Вызовите метод LoadProperties , чтобы загрузить оставшиеся свойства объекта. Если этот метод возвращает false, то либо на шаге 2 были неверно определены свойства публикации, либо публикация не существует.
Если для свойства SnapshotAgentExists указано значение false, вызовите CreateSnapshotAgent .
Вызовите метод StartSnapshotGenerationAgentJob , чтобы запустить задание агента, которое создает моментальный снимок для этой публикации.
Если параметр SnapshotAvailable равно true, моментальный снимок доступен для подписчиков (необязательно).
Создание исходного моментального снимка для публикации транзакций или моментальных снимков запуском агента моментальных снимков (в синхронном режиме)
Создайте экземпляр класса SnapshotGenerationAgent и укажите следующие необходимые свойства.
Publisher — имя издателя.
PublisherDatabase — имя базы данных публикации.
Publication — имя публикации.
Distributor — имя распространителя.
PublisherSecurityMode — значение Integrated для использования проверки подлинности Windows при подключении к издателю или значению Standard и значению PublisherLogin PublisherPassword и использованию проверки подлинности SQL Server при подключении к издателю. Рекомендуется использовать проверку подлинности Windows.
DistributorSecurityMode — значение Integrated для использования проверки подлинности Windows при подключении к распространителю или значений Standard DistributorLogin и значений для и DistributorPassword использования проверки подлинности SQL Server при подключении к распространителю. Рекомендуется использовать проверку подлинности Windows.
Укажите значение Transactional или Snapshot в параметре ReplicationType.
Вызовите метод GenerateSnapshot .
Создание исходного моментального снимка для публикации слиянием из задания агента моментальных снимков (в асинхронном режиме)
Создайте соединение с издателем с помощью класса ServerConnection .
Создайте экземпляр класса MergePublication. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.
Вызовите метод LoadProperties , чтобы загрузить оставшиеся свойства объекта. Если этот метод возвращает false, то либо на шаге 2 были неверно определены свойства публикации, либо публикация не существует.
Если для свойства SnapshotAgentExists указано значение false, вызовите CreateSnapshotAgent .
Вызовите метод StartSnapshotGenerationAgentJob , чтобы запустить задание агента, которое создает моментальный снимок для этой публикации.
Если параметр SnapshotAvailable равно true, моментальный снимок доступен для подписчиков (необязательно).
Создание исходного моментального снимка для публикации слиянием запуском агента моментальных снимков (в синхронном режиме)
Создайте экземпляр класса SnapshotGenerationAgent и укажите следующие необходимые свойства.
Publisher — имя издателя.
PublisherDatabase — имя базы данных публикации.
Publication — имя публикации.
Distributor — имя распространителя.
PublisherSecurityMode — значение Integrated для использования проверки подлинности Windows при подключении к издателю или значению Standard и значению PublisherLogin PublisherPassword и использованию проверки подлинности SQL Server при подключении к издателю. Рекомендуется использовать проверку подлинности Windows.
DistributorSecurityMode — значение Integrated для использования проверки подлинности Windows при подключении к распространителю или значений Standard DistributorLogin и значений для и DistributorPassword использования проверки подлинности SQL Server при подключении к распространителю. Рекомендуется использовать проверку подлинности Windows.
Укажите значение Merge в параметре ReplicationType.
Вызовите метод GenerateSnapshot .
Примеры (объекты RMO)
В следующем примере производится синхронный запуск агента моментальных снимков, который создает исходный моментальный снимок публикации транзакций.
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;
SnapshotGenerationAgent agent;
try
{
// Set the required properties for Snapshot Agent.
agent = new SnapshotGenerationAgent();
agent.Distributor = distributorName;
agent.DistributorSecurityMode = SecurityMode.Integrated;
agent.Publisher = publisherName;
agent.PublisherSecurityMode = SecurityMode.Integrated;
agent.Publication = publicationName;
agent.PublisherDatabase = publicationDbName;
agent.ReplicationType = ReplicationType.Transactional;
// Start the agent synchronously.
agent.GenerateSnapshot();
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"A snapshot could not be generated for the {0} publication."
, publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance
Dim agent As SnapshotGenerationAgent
Try
' Set the required properties for Snapshot Agent.
agent = New SnapshotGenerationAgent()
agent.Distributor = distributorName
agent.DistributorSecurityMode = SecurityMode.Integrated
agent.Publisher = publisherName
agent.PublisherSecurityMode = SecurityMode.Integrated
agent.Publication = publicationName
agent.PublisherDatabase = publicationDbName
agent.ReplicationType = ReplicationType.Transactional
' Start the agent synchronously.
agent.GenerateSnapshot()
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"A snapshot could not be generated for the {0} publication." _
, publicationName), ex)
End Try
В следующем примере производится асинхронный запуск задания агента моментальных снимков, который создает исходный моментальный снимок публикации транзакций.
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
TransPublication publication;
// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for an existing publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
if (publication.LoadProperties())
{
// Start the Snapshot Agent job for the publication.
publication.StartSnapshotGenerationAgentJob();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication does not exist.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"A snapshot could not be generated for the {0} publication."
, publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim publication As TransPublication
' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Set the required properties for an existing publication.
publication = New TransPublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
If publication.LoadProperties() Then
' Start the Snapshot Agent job for the publication.
publication.StartSnapshotGenerationAgentJob()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication does not exist.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"A snapshot could not be generated for the {0} publication." _
, publicationName), ex)
Finally
conn.Disconnect()
End Try
Блокировка при применении начального моментального снимка
Если у вас несколько публикаций, которые публикуют данные в одну базу данных на подписчиках, при применении начальных моментальных снимков вы заметите, что только одна публикация может применять свой моментальный снимок одновременно.
При проверке действия SQL может отображаться ресурс ожидания, аналогичный следующему:
APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9)
Запрос на блокировку может отображать ресурсы, аналогичные следующим:
APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X
Такое поведение предусмотрено программой. Это происходит, так как блокировка приложения используется для предотвращения одновременного применения моментальных снимков разных публикаций к одной и той же базе данных подписчика нескольких агентов репликации. Так как блокировка приложения содержит имя базы данных подписчика, все публикации, которые публикуются в той же базе данных подписчика, будут затронуты. Результатом является то, что в базу данных подписчика можно вставить только один моментальный снимок в определенное время.
Эксклюзивные блокировки используются в этой ситуации, чтобы избежать возможности взаимоблокировки агентов репликации друг с другом.
Чтобы обойти эту проблему, укажите другую базу данных подписчика для каждой публикации.
Связанный контент
- Create a Publication
- Create a Pull Subscription
- Create a Push Subscription
- Указание расписаний синхронизации
- Инициализация подписки с помощью моментального снимка
- Replication Management Objects Concepts
- Replication Security Best Practices
- Replication System Stored Procedures Concepts
- Использование программы sqlcmd с переменными скрипта