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


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

Область применения: SQL Server Управляемый экземпляр SQL Azure

В этом разделе описывается удаление подписки на вытягивание в SQL Server с помощью SQL Server Management Studio, Transact-SQL или объектов управления репликацией (RMO).

В этом разделе

Использование среды SQL Server Management Studio

Удалите подписку по запросу на издателе (из папки локальных публикаций в SQL Server Management Studio) или подписчика (из папки локальных подписок). При удалении подписки объекты и данные не удаляются из подписки, они должны быть удалены вручную.

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

  1. Подключитесь к издателю в СРЕДЕ SQL Server Management Studio и разверните узел сервера.

  2. Раскройте папку Репликация , а затем папку Локальные публикации .

  3. Раскройте публикацию, связанную с удаляемой подпиской.

  4. Правой кнопкой мыши щелкните подписку и затем щелкните Удалить.

  5. В окне подтверждения укажите, надо ли подключаться к подписчику для удаления сведений подписки. Если снять флажок Соединиться с подписчиком , то для удаления сведений потребуется соединиться с подписчиком позже.

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

  1. Подключитесь к подписчику в среде Microsoft SQL Server Management Studio и раскройте узел сервера.

  2. Раскройте папку Репликация , а затем — папку Локальные подписки .

  3. Правой кнопкой мыши щелкните подписку, которую желаете удалить, и затем щелкните Удалить.

  4. В окне подтверждения укажите, надо ли подключаться к издателю для удаления сведений подписки. Если снять флажок Соединиться с издателем , то для удаления сведений потребуется соединиться с издателем позже.

Использование Transact-SQL

Подписки по запросу могут быть удалены программным путем с помощью хранимых процедур репликации. Какие именно хранимые процедуры будут при этом применяться, зависит от типа публикации, к которой относится подписка.

Удаление подписки по запросу на публикацию моментальных снимков или транзакций

  1. На подписчике в базе данных подписки выполните sp_droppullsubscription (Transact-SQL). Задайте значения для параметров @publication, @publisherи @publisher_db.

  2. На издателе в базе данных публикации выполните sp_dropsubscription (Transact-SQL). Укажите параметры @publication и @subscriber. Задайте значение all в параметре @article. Если распространитель недоступен, задайте значение 1 в параметре @ignore_distributor , чтобы удалить подписку без удаления связанных с ней объектов на распространителе (необязательно).

Удаление подписки по запросу на публикацию слиянием

  1. На подписчике в базе данных подписки выполните sp_dropmergepullsubscription (Transact-SQL). Задайте значения для параметров @publication, @publisherи @publisher_db.

  2. На издателе в базе данных публикации выполните sp_dropmergesubscription (Transact-SQL). Задайте значения для параметров @publication, @subscriberи @subscriber_db. В качестве значения параметра @subscription_type укажите pull. Если распространитель недоступен, задайте значение 1 в параметре @ignore_distributor , чтобы удалить подписку без удаления связанных с ней объектов на распространителе (необязательно).

Примеры (Transact-SQL)

В следующем примере производится удаление подписки по запросу на публикацию транзакций. Первый пакет выполняется на подписчике, а второй — на издателе.

-- 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".

-- This is the batch executed at the Subscriber to drop 
-- a pull subscription to a transactional publication.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB     AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2022';

USE [AdventureWorks2022Replica]
EXEC sp_droppullsubscription 
  @publisher = @publisher, 
  @publisher_db = @publicationDB, 
  @publication = @publication;
GO
-- 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".

-- This batch is executed at the Publisher to remove 
-- a pull or push subscription to a transactional publication.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);

USE [AdventureWorks2022]
EXEC sp_dropsubscription 
  @publication = @publication, 
  @article = N'all',
  @subscriber = @subscriber;
GO

В следующем примере производится удаление подписки на публикацию слиянием. Первый пакет выполняется на подписчике, а второй — на издателе.

-- 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".

-- This batch is executed at the Subscriber to remove 
-- a merge pull subscription.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publication_db AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publication_db = N'AdventureWorks2022';

USE [AdventureWorks2022Replica]
EXEC sp_dropmergepullsubscription 
  @publisher = @publisher, 
  @publisher_db = @publication_db, 
  @publication = @publication;
GO
-- 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".

-- This batch is executed at the Publisher to remove 
-- a pull or push subscription to a merge publication.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2022Replica';

USE [AdventureWorks2022]
EXEC sp_dropmergesubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB;
GO

При помощи объектов RMO

Подписки по запросу можно удалять программно с помощью объектов RMO. Конкретные классы объектов RMO, используемые для удаления подписки по запросу, зависят от типа публикации, которой принадлежит эта подписка по запросу.

Удаление подписки по запросу на публикацию моментальных снимков или транзакций

  1. Создайте соединения с подписчиком и издателем с помощью класса ServerConnection .

  2. Создайте экземпляр класса TransPullSubscription и задайте свойства PublicationName, DatabaseName, PublisherNameи PublicationDBName . Чтобы установить свойство ConnectionContext , используется соединение подписчика из шага 1.

  3. Проверьте свойство IsExistingObject , чтобы убедиться, что подписка существует. Если это свойство имеет значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо подписка не существует.

  4. Вызовите метод Remove .

  5. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса TransPublication . Задайте свойства Name, DatabaseName и ConnectionContext.

  6. Вызовите метод LoadProperties . Если метод возвращает значение false, то либо неверно определены свойства, указанные на шаге 5, либо публикация не существует на сервере.

  7. Вызовите метод RemovePullSubscription . Укажите имя подписчика и имя базы данных подписки в параметрах subscriber и subscriberDB .

Удаление подписки по запросу на публикацию слиянием

  1. Создайте соединения с подписчиком и издателем с помощью класса ServerConnection .

  2. Создайте экземпляр класса MergePullSubscription и задайте свойства PublicationName, DatabaseName, PublisherNameи PublicationDBName . Чтобы установить свойство ConnectionContext , используется соединение из шага 1.

  3. Проверьте свойство IsExistingObject , чтобы убедиться, что подписка существует. Если это свойство имеет значение false, значит, на шаге 2 были неправильно заданы свойства подписки либо подписка не существует.

  4. Вызовите метод Remove .

  5. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса MergePublication . Задайте свойства Name, DatabaseName и ConnectionContext.

  6. Вызовите метод LoadProperties . Если метод возвращает значение false, то либо неверно определены свойства, указанные на шаге 5, либо публикация не существует на сервере.

  7. Вызовите метод RemovePullSubscription . Укажите имя подписчика и имя базы данных подписки в параметрах subscriber и subscriberDB .

Примеры (объекты RMO)

В этом примере удаляется подписка по запросу на публикацию транзакций, а также удаляется регистрация подписки на издателе.

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;

try
{
    // Connect to the Subscriber.
    subscriberConn.Connect();

    // Define the pull subscription.
    subscription = new TransPullSubscription();
    subscription.ConnectionContext = subscriberConn;
    subscription.PublisherName = publisherName;
    subscription.PublicationName = publicationName;
    subscription.PublicationDBName = publicationDbName;
    subscription.DatabaseName = subscriptionDbName;

    // Define the publication.
    publication = new TransPublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    // Delete the pull subscription, if it exists.
    if (subscription.IsExistingObject)
    {
        if (publication.LoadProperties())
        {
            // Remove the pull subscription registration at the Publisher.
            publication.RemovePullSubscription(subscriberName, subscriptionDbName);
        }
        else
        {
            // Do something here if the publication does not exist.
            throw new ApplicationException(String.Format(
                "The publication '{0}' does not exist on {1}.",
                publicationName, publisherName));
        }
        // Delete the pull subscription at the Subscriber.
        subscription.Remove();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The subscription to {0} does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be deleted.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription

Try
    ' Connect to the Subscriber.
    subscriberConn.Connect()

    ' Define the pull subscription.
    subscription = New TransPullSubscription()
    subscription.ConnectionContext = subscriberConn
    subscription.PublisherName = publisherName
    subscription.PublicationName = publicationName
    subscription.PublicationDBName = publicationDbName
    subscription.DatabaseName = subscriptionDbName

    ' Define the publication.
    publication = New TransPublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    ' Delete the pull subscription, if it exists.
    If subscription.IsExistingObject Then
       
        If publication.LoadProperties() Then
            ' Remove the pull subscription registration at the Publisher.
            publication.RemovePullSubscription(subscriberName, subscriptionDbName)
        Else
            ' Do something here if the publication does not exist.
            Throw New ApplicationException(String.Format( _
             "The publication '{0}' does not exist on {1}.", _
             publicationName, publisherName))
        End If
        ' Delete the pull subscription at the Subscriber.
        subscription.Remove()
    Else
        Throw New ApplicationException(String.Format( _
         "The subscription to {0} does not exist on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
        "The subscription to {0} could not be deleted.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

В этом примере удаляется подписка по запросу на публикацию слиянием, а также удаляется регистрация подписки на издателе.

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;

try
{
    // Connect to the Subscriber.
    subscriberConn.Connect();

    // Define the pull subscription.
    subscription = new MergePullSubscription();
    subscription.ConnectionContext = subscriberConn;
    subscription.PublisherName = publisherName;
    subscription.PublicationName = publicationName;
    subscription.PublicationDBName = publicationDbName;
    subscription.DatabaseName = subscriptionDbName;

    // Define the publication.
    publication = new MergePublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    // Delete the pull subscription, if it exists.
    if (subscription.IsExistingObject)
    {
        // Delete the pull subscription at the Subscriber.
        subscription.Remove();

        if (publication.LoadProperties())
        {
            publication.RemovePullSubscription(subscriberName, subscriptionDbName);
        }
        else
        {
            // Do something here if the publication does not exist.
            throw new ApplicationException(String.Format(
                "The publication '{0}' does not exist on {1}.",
                publicationName, publisherName));
        }
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The subscription to {0} does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be deleted.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    subscriberConn.Connect()

    ' Define the pull subscription.
    subscription = New MergePullSubscription()
    subscription.ConnectionContext = subscriberConn
    subscription.PublisherName = publisherName
    subscription.PublicationName = publicationName
    subscription.PublicationDBName = publicationDbName
    subscription.DatabaseName = subscriptionDbName

    ' Define the publication.
    publication = New MergePublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    ' Delete the pull subscription, if it exists.
    If subscription.IsExistingObject Then

        ' Delete the pull subscription at the Subscriber.
        subscription.Remove()

        If publication.LoadProperties() Then
            publication.RemovePullSubscription(subscriberName, subscriptionDbName)
        Else
            ' Do something here if the publication does not exist.
            Throw New ApplicationException(String.Format( _
             "The publication '{0}' does not exist on {1}.", _
             publicationName, publisherName))
        End If
    Else
        Throw New ApplicationException(String.Format( _
         "The subscription to {0} does not exist on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
        "The subscription to {0} could not be deleted.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

См. также

Subscribe to Publications
Replication Security Best Practices