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


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 , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.

  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 , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.

  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