Inaktivera publicering och distribution

gäller för:SQL ServerAzure SQL Managed Instance

Detta ämne beskriver hur man inaktiverar publicering och distribution i SQL Server genom att använda SQL Server Management Studio, Transact-SQL eller Replication Management Objects (RMO).

Du kan göra följande:

  • Radera alla distributionsdatabaser på distributören.

  • Inaktivera alla utgivare som använder distributören och radera alla publikationer på dessa utgivare.

  • Radera alla prenumerationer på publikationerna. Data i publikations- och prenumerationsdatabaserna kommer inte att raderas; dock förlorar den sin synkroniseringsrelation till alla publikationsdatabaser. Om du vill att datan hos prenumeranten ska raderas måste du radera den manuellt.

Förutsättningar

  • För att inaktivera publicering och distribution måste all distribution och publiceringsdatabaser vara online. Om det finns några databasögonblicksbilder för distribution eller publiceringsdatabaser måste de tas bort innan publicering och distribution inaktiveras. En databassnapshot är en skrivskyddad offline-kopia av en databas och är inte relaterad till en replikeringssnapshot. Mer information finns i Ögonblicksbilder av databaser (SQL Server).

Använda SQL Server Management Studio

Inaktivera publicering och distribution genom att använda Inaktivera publicerings- och distributionsguiden.

För att inaktivera publicering och distribution

  1. Anslut till den Publisher eller Distributor du vill inaktivera i Microsoft SQL Server Management Studio, och expandera sedan servernoden.

  2. Högerklicka på mappen Replikering och sedan på Inaktivera publicering och distribution.

  3. Slutför stegen i guiden för att inaktivera publicering och distribution.

Använda Transact-SQL

Publicering och distribution kan inaktiveras programmässigt med hjälp av replikeringslagrade procedurer.

För att inaktivera publicering och distribution

  1. Sluta med alla replikationsrelaterade jobb. För en lista över jobbnamn, se avsnittet "Agent Security Under SQL Server Agent" i Replication Agent Security Model.

  2. Vid varje prenumerant i prenumerationsdatabasen, kör sp_removedbreplication för att ta bort replikeringsobjekt från databasen. Denna lagrade procedur tar inte bort replikeringsjobb hos distributören.

  3. Vid Publisher i publiceringsdatabasen kör sp_removedbreplication för att ta bort replikeringsobjekt från databasen.

  4. Om Publisher använder en fjärrdistributör, kör sp_dropdistributor.

  5. På Distributorn kör du sp_dropdistpublisher. Denna lagrade propus bör köras en gång för varje Publisher som är registrerad hos distributören.

  6. På distributören, kör sp_dropdistributiondb för att ta bort distributionsdatabasen. Denna lagrade procedur bör köras en gång för varje distributionsdatabas hos distributören. Detta tar också bort alla Queue Reader Agent-jobb kopplade till distributionsdatabasen.

  7. På Distributören, kör sp_dropdistributor för att ta bort Distributörsbeteckningen från servern.

    Note

    Om alla replikeringspublicerings- och distributionsobjekt inte tas bort innan du kör sp_dropdistpublisher och sp_dropdistributor, kommer dessa procedurer att ge ett fel. För att ta bort alla replikeringsrelaterade objekt när en Publisher eller Distributor tas bort måste parametern @no_checks sättas till 1. Om en Publisher eller Distributor är offline eller otillgänglig kan parametern @ignore_distributor sättas till 1 så att de kan tas bort; dock måste alla publicerings- och distributionsobjekt som lämnas kvar tas bort manuellt.

Exempel (Transact-SQL)

Detta exempelskript tar bort replikationsobjekt från prenumerationsdatabasen.

-- Remove replication objects from the subscription database on MYSUB.
DECLARE @subscriptionDB AS sysname
SET @subscriptionDB = N'AdventureWorks2022Replica'

-- Remove replication objects from a subscription database (if necessary).
USE master
EXEC sp_removedbreplication @subscriptionDB
GO

Detta exempelskript inaktiverar publicering och distribution på en server som är Publisher och Distributor och tar bort distributionsdatabasen.

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

-- Disable publishing and distribution.
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB as sysname;
SET @distributionDB = N'distribution';
SET @publisher = $(DistPubServer);
SET @publicationDB = N'AdventureWorks2022';

-- Disable the publication database.
USE [AdventureWorks2022]
EXEC sp_removedbreplication @publicationDB;

-- Remove the registration of the local Publisher at the Distributor.
USE master
EXEC sp_dropdistpublisher @publisher;

-- Delete the distribution database.
EXEC sp_dropdistributiondb @distributionDB;

-- Remove the local server as a Distributor.
EXEC sp_dropdistributor;
GO

Använda replikeringshanteringsobjekt (RMO)

För att inaktivera publicering och distribution

  1. Ta bort alla prenumerationer på publikationer som använder distributören. För mer information, se Ta bort en Pull-prenumeration och Ta bort en Push-prenumeration.

  2. Ta bort alla publikationer som använder Distributor och inaktivera publicering för alla databaser om Publisher och Distributor finns på samma server. Mer information finns i Ta bort en publikation.

  3. Skapa en anslutning till distributören med hjälp av klassen ServerConnection.

  4. Skapa en instans av DistributionPublisher klassen. Specificera Name egenskapen och skicka objektet ServerConnection från steg 3.

  5. (Valfritt) Anropa LoadProperties metoden för att hämta objektets egenskaper och verifiera att Publisher finns. Om denna metod returnerar falskt, var Publisher-namnet som sattes i steg 4 felaktigt eller så används inte Publisher av denna distributör.

  6. Anropa Remove metoden. Ange värdet true för force om Publishern och Distributorn finns på olika servrar och när Publishern ska avinstalleras på Distributorn utan att först verifiera att publikationer inte längre finns på Publishern.

  7. Skapa en instans av ReplicationServer klassen. Skicka över objektet ServerConnection från steg 3.

  8. Anropa UninstallDistributor metoden. Ange värdet true förforce för att ta bort alla replikeringsobjekt hos distributören utan att först verifiera att alla lokala publiceringsdatabaser har inaktiverats och att distributionsdatabaserna har avinstallerats.

Exempel (RMO)

Detta exempel tar bort Publisher-registreringen hos Distributor, tar bort distributionsdatabasen och avinstallerar Distributoren.

// Set the Distributor and publication database names.
// Publisher and Distributor are on the same server instance.
string publisherName = publisherInstance;
string distributorName = publisherInstance;
string distributionDbName = "distribution";
string publicationDbName = "AdventureWorks2022";

// Create connections to the Publisher and Distributor
// using Windows Authentication.
ServerConnection publisherConn = new ServerConnection(publisherName);
ServerConnection distributorConn = new ServerConnection(distributorName);

// Create the objects we need.
ReplicationServer distributor =
    new ReplicationServer(distributorConn);
DistributionPublisher publisher;
DistributionDatabase distributionDb =
    new DistributionDatabase(distributionDbName, distributorConn);
ReplicationDatabase publicationDb;
publicationDb = new ReplicationDatabase(publicationDbName, publisherConn);

try
{
    // Connect to the Publisher and Distributor.
    publisherConn.Connect();
    distributorConn.Connect();

    // Disable all publishing on the AdventureWorks2022 database.
    if (publicationDb.LoadProperties())
    {
        if (publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = false;
        }
        else if (publicationDb.EnabledTransPublishing)
        {
            publicationDb.EnabledTransPublishing = false;
        }
    }
    else
    {
        throw new ApplicationException(
            String.Format("The {0} database does not exist.", publicationDbName));
    }

    // We cannot uninstall the Publisher if there are still Subscribers.
    if (distributor.RegisteredSubscribers.Count == 0)
    {
        // Uninstall the Publisher, if it exists.
        publisher = new DistributionPublisher(publisherName, distributorConn);
        if (publisher.LoadProperties())
        {
            publisher.Remove(false);
        }
        else
        {
            // Do something here if the Publisher does not exist.
            throw new ApplicationException(String.Format(
                "{0} is not a Publisher for {1}.", publisherName, distributorName));
        }

        // Drop the distribution database.
        if (distributionDb.LoadProperties())
        {
            distributionDb.Remove();
        }
        else
        {
            // Do something here if the distribition DB does not exist.
            throw new ApplicationException(String.Format(
                "The distribution database '{0}' does not exist on {1}.",
                distributionDbName, distributorName));
        }

        // Uninstall the Distributor, if it exists.
        if (distributor.LoadProperties())
        {
            // Passing a value of false means that the Publisher 
            // and distribution databases must already be uninstalled,
            // and that no local databases be enabled for publishing.
            distributor.UninstallDistributor(false);
        }
        else
        {
            //Do something here if the distributor does not exist.
            throw new ApplicationException(String.Format(
                "The Distributor '{0}' does not exist.", distributorName));
        }
    }
    else
    {
        throw new ApplicationException("You must first delete all subscriptions.");
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The Publisher and Distributor could not be uninstalled", ex);
}
finally
{
    publisherConn.Disconnect();
    distributorConn.Disconnect();
}
' Set the Distributor and publication database names.
' Publisher and Distributor are on the same server instance.
Dim publisherName As String = publisherInstance
Dim distributorName As String = subscriberInstance
Dim distributionDbName As String = "distribution"
Dim publicationDbName As String = "AdventureWorks2022"

' Create connections to the Publisher and Distributor
' using Windows Authentication.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)

' Create the objects we need.
Dim distributor As ReplicationServer
distributor = New ReplicationServer(distributorConn)
Dim publisher As DistributionPublisher
Dim distributionDb As DistributionDatabase
distributionDb = New DistributionDatabase(distributionDbName, distributorConn)
Dim publicationDb As ReplicationDatabase
publicationDb = New ReplicationDatabase(publicationDbName, publisherConn)

Try
    ' Connect to the Publisher and Distributor.
    publisherConn.Connect()
    distributorConn.Connect()

    ' Disable all publishing on the AdventureWorks2022 database.
    If publicationDb.LoadProperties() Then
        If publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = False
        ElseIf publicationDb.EnabledTransPublishing Then
            publicationDb.EnabledTransPublishing = False
        End If
    Else
        Throw New ApplicationException( _
            String.Format("The {0} database does not exist.", publicationDbName))
    End If

    ' We cannot uninstall the Publisher if there are still Subscribers.
    If distributor.RegisteredSubscribers.Count = 0 Then
        ' Uninstall the Publisher, if it exists.
        publisher = New DistributionPublisher(publisherName, distributorConn)
        If publisher.LoadProperties() Then
            publisher.Remove(False)
        Else
            ' Do something here if the Publisher does not exist.
            Throw New ApplicationException(String.Format( _
                "{0} is not a Publisher for {1}.", publisherName, distributorName))
        End If

        ' Drop the distribution database.
        If distributionDb.LoadProperties() Then
            distributionDb.Remove()
        Else
            ' Do something here if the distribition DB does not exist.
            Throw New ApplicationException(String.Format( _
             "The distribution database '{0}' does not exist on {1}.", _
             distributionDbName, distributorName))
        End If

        ' Uninstall the Distributor, if it exists.
        If distributor.LoadProperties() Then
            ' Passing a value of false means that the Publisher 
            ' and distribution databases must already be uninstalled,
            ' and that no local databases be enabled for publishing.
            distributor.UninstallDistributor(False)
        Else
            'Do something here if the distributor does not exist.
            Throw New ApplicationException(String.Format( _
                "The Distributor '{0}' does not exist.", distributorName))
        End If
    Else
        Throw New ApplicationException("You must first delete all subscriptions.")
    End If

Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The Publisher and Distributor could not be uninstalled", ex)

Finally
    publisherConn.Disconnect()
    distributorConn.Disconnect()

End Try

Detta exempel avinstallerar distributören utan att först inaktivera lokala publiceringsdatabaser eller lägga ner distributionsdatabasen.

// Set the Distributor and publication database names.
// Publisher and Distributor are on the same server instance.
string distributorName = publisherInstance;

// Create connections to the Distributor
// using Windows Authentication.
ServerConnection conn = new ServerConnection(distributorName);
conn.DatabaseName = "master";

// Create the objects we need.
ReplicationServer distributor = new ReplicationServer(conn);

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


    // Uninstall the Distributor, if it exists.
    // Use the force parameter to remove everthing.  
    if (distributor.IsDistributor && distributor.LoadProperties())
    {
        // Passing a value of true means that the Distributor 
        // is uninstalled even when publishing objects, subscriptions,
        // and distribution databases exist on the server.
        distributor.UninstallDistributor(true);
    }
    else
    {
        //Do something here if the distributor does not exist.
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The Publisher and Distributor could not be uninstalled", ex);
}
finally
{
    conn.Disconnect();
}
' Set the Distributor and publication database names.
' Publisher and Distributor are on the same server instance.
Dim distributorName As String = publisherInstance

' Create connections to the Distributor
' using Windows Authentication.
Dim conn As ServerConnection = New ServerConnection(distributorName)
conn.DatabaseName = "master"

' Create the objects we need.
Dim distributor As ReplicationServer = New ReplicationServer(conn)

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


    ' Uninstall the Distributor, if it exists.
    ' Use the force parameter to remove everthing.  
    If distributor.IsDistributor And distributor.LoadProperties() Then
        ' Passing a value of true means that the Distributor 
        ' is uninstalled even when publishing objects, subscriptions,
        ' and distribution databases exist on the server.
        distributor.UninstallDistributor(True)
    Else
        'Do something here if the distributor does not exist.
    End If

Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The Publisher and Distributor could not be uninstalled", ex)

Finally
    conn.Disconnect()

End Try