Supprimer une publication

S’applique à : SQL Server Azure SQL Managed Instance

Cette rubrique décrit comment supprimer une publication dans SQL Server en utilisant SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO).

Dans cette rubrique

Utilisation de SQL Server Management Studio

Supprimer les publications dans le dossier Publications locales de SQL Server Management Studio.

Pour supprimer une publication

  1. Connectez-vous au serveur de publication dans Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication , puis développez le dossier Publications locales .

  3. Cliquez avec le bouton droit sur la publication à supprimer, puis cliquez sur Supprimer.

Utilisation de Transact-SQL

Il est possible de supprimer des publications par programme en utilisant les procédures stockées de réplication. Les procédures stockées à utiliser dépendent du type de publication à supprimer.

Remarque

La suppression d'une publication ne supprime pas les objets publiés de la base de données de publication ni les objets correspondants de la base de données d'abonnement. Utilisez la commande DROP <object> pour supprimer manuellement ces objets, si nécessaire.

Pour supprimer une publication d'instantané ou une publication transactionnelle

  1. Effectuez l’une des opérations suivantes :

    • Pour supprimer une publication unique, exécutez sp_droppublication sur la base de données de publication du serveur de publication.

    • Pour supprimer toutes les publications et tous les objets de réplication d'une base de données publiée, exécutez sp_removedbreplication sur le serveur de publication. Spécifiez la valeur tran pour @type. (Facultatif) Si le serveur de distribution est inaccessible ou si l'état de la base de données est suspect ou hors connexion, spécifiez la valeur 1 pour @force. (Facultatif) Spécifiez le nom de la base de données pour @dbname si sp_removedbreplication n'est pas exécuté sur la base de données de publication.

      Remarque

      Spécifier la valeur 1 pour @force peut laisser des objets de publication liés à la réplication dans la base de données.

  2. (Facultatif) Si cette base de données n’a pas d’autres publications, exécutez sp_replicationdboption (Transact-SQL) pour désactiver la publication de la base de données actuelle à l’aide de la réplication transactionnelle ou d’instantané.

  3. (Facultatif) Exécutez sp_subscription_cleanup sur la base de données d'abonnement de l'Abonné pour supprimer toutes les métadonnées de réplication restantes dans la base de données d'abonnement.

Pour supprimer une publication de fusion

  1. Effectuez l’une des opérations suivantes :

    • Pour supprimer une publication unique, exécutez sp_dropmergepublication (Transact-SQL) sur la base de données de publication du serveur de publication.

    • Pour supprimer toutes les publications et tous les objets de réplication d'une base de données publiée, exécutez sp_removedbreplication sur le serveur de publication. Spécifiez la valeur merge pour @type. (Facultatif) Si le serveur de distribution est inaccessible ou si l'état de la base de données est suspect ou hors connexion, spécifiez la valeur 1 pour @force. (Facultatif) Spécifiez le nom de la base de données pour @dbname si sp_removedbreplication n'est pas exécuté sur la base de données de publication.

      Remarque

      Spécifier la valeur 1 pour @force peut laisser des objets de publication liés à la réplication dans la base de données.

  2. (Facultatif) Si cette base de données n’a pas d’autres publications, exécutez sp_replicationdboption (Transact-SQL) pour désactiver la publication de la base de données actuelle à l’aide de la réplication de fusion.

  3. (Facultatif) Exécutez sp_mergesubscription_cleanup (Transact-SQL) sur la base de données d’abonnement de l’Abonné pour supprimer toutes les métadonnées de réplication restantes dans la base de données d’abonnement.

Exemples (Transact-SQL)

Cet exemple montre comment supprimer une publication transactionnelle et désactiver la publication transactionnelle d'une base de données. Cet exemple suppose que tous les abonnements ont été supprimés précédemment. Pour plus d'informations, consultez Delete a Pull Subscription ou 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

Cet exemple montre comment supprimer une publication de fusion et désactiver la publication de fusion d'une base de données. Cet exemple suppose que tous les abonnements ont été supprimés précédemment. Pour plus d'informations, consultez Delete a Pull Subscription ou 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

Utilisation d'objets RMO (Replication Management Objects)

Vous pouvez supprimer des publications par programme à l'aide d'objets RMO (Replication Management Objects). Les classes RMO que vous utilisez pour supprimer une publication dépendent du type de publication que vous supprimez.

Pour supprimer une publication transactionnelle ou d'instantané

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe TransPublication.

  3. Définissez les propriétés Name et DatabaseName de la publication, et définissez la propriété ConnectionContext avec la connexion créée à l'étape 1.

  4. Vérifiez la propriété IsExistingObject pour vous assurer que la publication existe. Si la valeur de cette propriété est false, les propriétés de la publication définies à l'étape 3 sont incorrectes ou la publication n'existe pas.

  5. Appelez la méthode Remove .

  6. (Facultatif) Si aucune autre publication transactionnelle n'existe pour cette base de données, vous pouvez désactiver la base de données pour la publication transactionnelle en procédant comme suit :

    1. Créez une instance de la classe ReplicationDatabase. Affectez à la propriété ConnectionContext l'instance de ServerConnection créée à l'étape 1.

    2. Appelez la méthode LoadProperties . Si cette méthode retourne false, confirmez que la base de données existe.

    3. Définissez les propriétés EnabledTransPublishing la valeur false.

    4. Appelez la méthode CommitPropertyChanges .

  7. Fermez les connexions.

Pour supprimer une publication de fusion

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe MergePublication.

  3. Définissez les propriétés Name et DatabaseName de la publication, et définissez la propriété ConnectionContext avec la connexion créée à l'étape 1.

  4. Vérifiez la propriété IsExistingObject pour vous assurer que la publication existe. Si la valeur de cette propriété est false, les propriétés de la publication définies à l'étape 3 sont incorrectes ou la publication n'existe pas.

  5. Appelez la méthode Remove .

  6. (Facultatif) Si aucune autre publication de fusion n'existe pour cette base de données, vous pouvez désactiver la base de données pour la publication de fusion en procédant comme suit :

    1. Créez une instance de la classe ReplicationDatabase. Affectez à la propriété ConnectionContext l'instance de ServerConnection créée à l'étape 1.

    2. Appelez la méthode LoadProperties . Si cette méthode retourne false, vérifiez que la base de données existe.

    3. Définissez les propriétés EnabledMergePublishing la valeur false.

    4. Appelez la méthode CommitPropertyChanges .

  7. Fermez les connexions.

Exemples (RMO)

L'exemple suivant supprime une publication transactionnelle. Si aucune autre publication transactionnelle n'existe pour cette base de données, la publication transactionnelle est également désactivée.

// 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

L'exemple suivant supprime une publication de fusion. Si aucune autre publication de fusion n'existe pour cette base de données, la publication de fusion est également désactivée.

// 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