Delete a Publication (Удаление публикации)

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

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

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

Удалите публикации из папки локальных публикаций в SQL Server Management Studio.

Удаление публикации

  1. Подключитесь к издателю в Management Studio и разверните узел сервера.

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

  3. Щелкните правой кнопкой мыши публикацию, которую требуется удалить, и выберите Удалить.

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

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

Примечание.

При удалении публикации опубликованные объекты базы данных публикации и связанные с ними объекты базы данных подписки не удаляются. При необходимости их необходимо удалить вручную, при помощи инструкции DROP <object> .

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

  1. Выполните одно из следующих действий:

    • Для удаления отдельной публикации в базе данных публикации на издателе выполните инструкцию sp_droppublication .

    • Чтобы удалить все публикации и удалить все объекты репликации из опубликованной базы данных, выполните процедуру sp_removedbreplication на издателе. Укажите значение tran в параметре @type. Если распространитель недоступен или база данных находится в подозрительном состоянии или в режиме «вне сети», укажите значение 1 в параметре @force(необязательно). (Необязательно) Укажите имя базы данных для @dbname, если процедура sp_removedbreplication не была выполнена в базе данных публикации.

      Примечание.

      Если задать значение 1 в параметре @force , в базе данных могут остаться объекты публикации, связанные с репликацией.

  2. (Необязательно) Если у этой базы данных нет других публикаций, выполните sp_replicationdboption (Transact-SQL), чтобы отключить публикацию текущей базы данных с помощью моментального снимка или репликации транзакций.

  3. (Необязательно) На подписчике в базе данных подписки выполните хранимую процедуру sp_subscription_cleanup, чтобы удалить все оставшиеся метаданные репликации в базе данных подписки.

Удалить публикацию слияния

  1. Выполните одно из следующих действий:

    • Чтобы удалить отдельную публикацию, выполните sp_dropmergepublication (Transact-SQL) на сервере-издателе в базе данных публикации.

    • Чтобы удалить все публикации и удалить все объекты репликации из опубликованной базы данных, выполните процедуру sp_removedbreplication на издателе. Укажите значение merge в параметре @type. Если распространитель недоступен или база данных находится в подозрительном состоянии или в режиме «вне сети», укажите значение 1 в параметре @force(необязательно). (Необязательно) Укажите имя базы данных для @dbname, если процедура sp_removedbreplication не была выполнена в базе данных публикации.

      Примечание.

      Если задать значение 1 в параметре @force , в базе данных могут остаться объекты публикации, связанные с репликацией.

  2. (Необязательно) Если в этой базе данных нет других публикаций, выполните sp_replicationdboption (Transact-SQL), чтобы отключить публикацию текущей базы данных с помощью репликации слиянием.

  3. (Необязательно) На узле-подписчике в базе данных подписки выполните sp_mergesubscription_cleanup (Transact-SQL), чтобы удалить все оставшиеся метаданные репликации в базе данных подписки.

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

В следующем примере показано удаление публикации транзакций и отключение функции публикации транзакций для базы данных. В этом примере предполагается, что все подписки были удалены ранее. Дополнительные сведения см. в разделе Delete a Pull Subscription или Delete a Push Subscription.

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksProductTran'; 

-- Remove a transactional publication.
USE [AdventureWorks2022]
EXEC sp_droppublication @publication = @publication;

-- Remove replication objects from the database.
USE [master]
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish', 
  @value = N'false';
GO

В этом примере показано, как удалить публикацию слияния и отключить публикацию слияния для базы данных. В этом примере предполагается, что все подписки были удалены ранее. Дополнительные сведения см. в разделе Delete a Pull Subscription или Delete a Push Subscription.

DECLARE @publication AS sysname
DECLARE @publicationDB    AS sysname
SET @publication = N'AdvWorksSalesOrdersMerge' 
SET @publicationDB = N'AdventureWorks'

-- Remove the merge publication.
USE [AdventureWorks]
EXEC sp_dropmergepublication @publication = @publication;

-- Remove replication objects from the database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'merge publish', 
  @value = N'false'
GO

Использование объектов управления репликацией (RMO)

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

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

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

  2. Создайте экземпляр класса TransPublication.

  3. Задайте для публикации свойства Name и DatabaseName, а также установите для свойства ConnectionContext значение «соединение, созданное на шаге 1».

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

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

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

    1. Создайте экземпляр класса ReplicationDatabase. В качестве значения для свойства ConnectionContext укажите экземпляр соединения ServerConnection , созданный на шаге 1.

    2. Вызовите метод LoadProperties . Если этот метод возвращает значение false, убедитесь, что база данных существует.

    3. Установите для свойства EnabledTransPublishing значение false.

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

  7. Закройте соединения.

Удалить публикацию слияния

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

  2. Создайте экземпляр класса MergePublication.

  3. Задайте свойства Name и DatabaseName для публикации, а затем установите для свойства ConnectionContext значение «соединение», созданное на шаге 1.

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

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

  6. (Необязательно) Если для этой базы данных не существует других публикаций слиянием, базу данных можно отключить для публикации слиянием следующим образом:

    1. Создайте экземпляр класса ReplicationDatabase. Присвойте свойству ConnectionContext значение экземпляра ServerConnection из шага 1.

    2. Вызовите метод LoadProperties . Если этот метод возвращает значение false, проверьте, существует ли база данных.

    3. Установите для свойства EnabledMergePublishing значение false.

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

  7. Закройте соединения.

Примеры (RMO)

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

// Define the Publisher, publication database, 
// and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";

TransPublication publication;
ReplicationDatabase publicationDb;

// Create a connection to the Publisher 
// using Windows Authentication.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    conn.Connect();

    // Set the required properties for the transactional publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Delete the publication, if it exists and has no subscriptions.
    if (publication.LoadProperties() && !publication.HasSubscription)
    {
        publication.Remove();
    }
    else
    {
        // Do something here if the publication does not exist
        // or has subscriptions.
        throw new ApplicationException(String.Format(
            "The publication {0} could not be deleted. " +
            "Ensure that the publication exists and that all " +
            "subscriptions have been deleted.",
            publicationName, publisherName));
    }

    // If no other transactional publications exists,
    // disable publishing on the database.
    publicationDb = new ReplicationDatabase(publicationDbName, conn);
    if (publicationDb.LoadProperties())
    {
        if (publicationDb.TransPublications.Count == 0)
        {
            publicationDb.EnabledTransPublishing = false;
        }
    }
    else
    {
        // Do something here if the database does not exist.
        throw new ApplicationException(String.Format(
            "The database {0} does not exist on {1}.",
            publicationDbName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be deleted.",
        publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication database, 
' and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publication As TransPublication
Dim publicationDb As ReplicationDatabase

' Create a connection to the Publisher 
' using Windows Authentication.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    conn.Connect()

    ' Set the required properties for the transactional publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Delete the publication, if it exists and has no subscriptions.
    If publication.LoadProperties() And Not publication.HasSubscription Then
        publication.Remove()
    Else
        ' Do something here if the publication does not exist
        ' or has subscriptions.
        Throw New ApplicationException(String.Format( _
         "The publication {0} could not be deleted. " + _
         "Ensure that the publication exists and that all " + _
         "subscriptions have been deleted.", _
         publicationName, publisherName))
    End If

    ' If no other transactional publications exists,
    ' disable publishing on the database.
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If publicationDb.TransPublications.Count = 0 Then
            publicationDb.EnabledTransPublishing = False
        End If
    Else
        ' Do something here if the database does not exist.
        Throw New ApplicationException(String.Format( _
         "The database {0} does not exist on {1}.", _
         publicationDbName, publisherName))
    End If
Catch ex As Exception
    ' Implement application error handling here.
    Throw New ApplicationException(String.Format( _
     "The publication {0} could not be deleted.", _
     publicationName), ex)
Finally
    conn.Disconnect()
End Try

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

// Define the Publisher, publication database, 
// and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";

MergePublication publication;
ReplicationDatabase publicationDb;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for the merge publication.
    publication = new MergePublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Delete the publication, if it exists and has no subscriptions.
    if (publication.LoadProperties() && !publication.HasSubscription)
    {
        publication.Remove();
    }
    else
    {
        // Do something here if the publication does not exist
        // or has subscriptions.
        throw new ApplicationException(String.Format(
            "The publication {0} could not be deleted. " +
            "Ensure that the publication exists and that all " +
            "subscriptions have been deleted.",
            publicationName, publisherName));
    }

    // If no other merge publications exists,
    // disable publishing on the database.
    publicationDb = new ReplicationDatabase(publicationDbName, conn);
    if (publicationDb.LoadProperties())
    {
        if (publicationDb.MergePublications.Count == 0 && publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = false;
        }
    }
    else
    {
        // Do something here if the database does not exist.
        throw new ApplicationException(String.Format(
            "The database {0} does not exist on {1}.",
            publicationDbName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be deleted.",
        publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication database, 
' and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publication As MergePublication
Dim publicationDb As ReplicationDatabase

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for the merge publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Delete the publication, if it exists and has no subscriptions.
    If (publication.LoadProperties() And Not publication.HasSubscription) Then
        publication.Remove()
    Else
        ' Do something here if the publication does not exist
        ' or has subscriptions.
        Throw New ApplicationException(String.Format( _
         "The publication {0} could not be deleted. " + _
         "Ensure that the publication exists and that all " + _
         "subscriptions have been deleted.", _
         publicationName, publisherName))
    End If

    ' If no other merge publications exists,
    ' disable publishing on the database.
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If publicationDb.MergePublications.Count = 0 _
        And publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = False
        End If
    Else
        ' Do something here if the database does not exist.
        Throw New ApplicationException(String.Format( _
         "The database {0} does not exist on {1}.", _
         publicationDbName, publisherName))
    End If
Catch ex As Exception
    ' Implement application error handling here.
    Throw New ApplicationException(String.Format( _
     "The publication {0} could not be deleted.", _
     publicationName), ex)
Finally
    conn.Disconnect()
End Try