Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Istanza gestita di SQL di Azure
Questo articolo descrive come disabilitare la pubblicazione e la distribuzione in SQL Server utilizzando SQL Server Management Studio, Transact-SQL o Replication Management Objects (RMO).
Puoi eseguire i seguenti passaggi:
Eliminare tutti i database di distribuzione nel server di distribuzione.
Disabilitare tutti i server di pubblicazione che utilizzano il server di distribuzione ed eliminare da tali server tutte le pubblicazioni.
Eliminare tutte le sottoscrizioni delle pubblicazioni. I dati dei database di pubblicazione e sottoscrizione non vengono eliminati, ma la relazione di sincronizzazione con i database di pubblicazione andrà perduta. L'eliminazione dei dati nel Sottoscrittore deve essere eseguita in modo manuale.
Prerequisiti
- Per disabilitare la pubblicazione e la distribuzione, è necessario che tutti i database di distribuzione e pubblicazione siano online. Se sono presenti snapshot di database per i database di distribuzione o di pubblicazione, è necessario eliminarli prima di disabilitare la pubblicazione e la distribuzione. Uno snapshot di database è una copia offline di sola lettura di un database e non è correlato a uno snapshot di replica. Per altre informazioni, vedere Snapshot del database (SQL Server).
Utilizzo di SQL Server Management Studio
Usa il Computer Disabilita Pubblicazione e Distribuzione per disabilitare la pubblicazione e la distribuzione.
Per disabilitare la pubblicazione e la distribuzione
Connettersi al server di pubblicazione o di distribuzione da disabilitare in Microsoft SQL Server Management Studio e quindi espandere il nodo del server.
Fare clic con il pulsante destro del mouse sulla cartella Replica e quindi scegliere Disabilita pubblicazione e distribuzione.
Completare i passaggi della procedura guidata per la disabilitazione della pubblicazione e della distribuzione.
Utilizzo di Transact-SQL
È possibile disabilitare la pubblicazione e la distribuzione tramite le stored procedure di replica.
Per disabilitare la pubblicazione e la distribuzione
Interrompere tutte le operazioni relative alla replica. Per un elenco dei nomi dei processi, vedere la sezione "Sicurezza dell'agente in SQL Server Agent" di Modello di sicurezza dell'agente di replica.
Nel database di sottoscrizione di ogni sottoscrittore, eseguire sp_removedbreplication per rimuovere gli oggetti di replica dal database. Questa stored procedure non rimuove i processi di replica nel Distributore.
Nel database di pubblicazione del server di pubblicazione, eseguire sp_removedbreplication per rimuovere gli oggetti di replica dal database.
Se il server di pubblicazione usa un server di distribuzione remoto, eseguire sp_dropdistributor.
Nel server di distribuzione eseguire sp_dropdistpublisher. Esegui questa stored procedure una volta per ciascun Publisher registrato presso il Distributore.
Nel database di distribuzione eseguire sp_dropdistributiondb per eliminare il database di distribuzione. Esegui questa procedura memorizzata una volta per ogni database di distribuzione presso il Distributore. Questa azione rimuove anche tutti i processi dell'Agente di lettura coda associati al database di distribuzione.
Nel server di distribuzione eseguire sp_dropdistributor per rimuovere la designazione di server di distribuzione dal server.
Nota
Se non elimini tutti gli oggetti di pubblicazione e distribuzione di replicazione prima di eseguire sp_dropdistpublisher e sp_dropdistributor, queste procedure restituiscono un errore. Per eliminare tutti gli oggetti legati alla replica quando viene eliminato un Publisher o un Distributore, imposta il
@no_checksparametro a 1. Se un Publisher o un Distributore è offline o irraggiungibile, imposta il@ignore_distributorparametro a 1 così puoi eliminarlo. Tuttavia, devi rimuovere manualmente qualsiasi oggetto di pubblicazione e distribuzione lasciato indietro.
Esempi (Transact-SQL)
In questo esempio di script vengono rimossi oggetti della replica dal database di sottoscrizione.
-- 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
Questo script di esempio disabilita la pubblicazione e la distribuzione su un server che funge sia da Publisher che da Distributor ed elimina il database di distribuzione.
-- 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
Utilizzo di RMO (Replication Management Objects)
Per disabilitare la pubblicazione e la distribuzione
Rimuovere tutte le sottoscrizioni alle pubblicazioni che utilizzano il Distributore. Per ulteriori informazioni, vedere Delete a Pull Subscription e Delete a Push Subscription.
Rimuovere tutte le pubblicazioni che utilizzano il server di distribuzione e disabilitare la pubblicazione per tutti i database se il server di pubblicazione e il server di distribuzione si trovano nello stesso server. Per altre informazioni, vedere Delete a Publication.
Creare una connessione al server di distribuzione tramite la classe ServerConnection .
Creare un'istanza della classe DistributionPublisher. Specificare la proprietà Name e passare l'oggetto ServerConnection ottenuto al passaggio 3.
(Facoltativo) Chiamare il metodo LoadProperties per ottenere le proprietà dell'oggetto e verificare che il server di pubblicazione esista. Se questo metodo restituisce falso, il nome Publisher impostato nel passo 4 era errato oppure l'Publisher non è stato usato da questo Distributore.
Chiamare il metodo Remove . Passare il valore true per force se il server di pubblicazione e il server di distribuzione si trovano in server diversi e quando il server di pubblicazione deve essere disinstallato dal server di distribuzione senza prima verificare non esistano più pubblicazioni nel server di pubblicazione.
Creare un'istanza della classe ReplicationServer. Passare l'oggetto ServerConnection indicato nel passaggio 3.
Chiamare il metodo UninstallDistributor . Passare il valore true per force per rimuovere tutti gli oggetti di replica dal Distributore senza prima verificare che tutti i database di pubblicazione locali siano disabilitati e che i database di distribuzione siano disinstallati.
Esempi (RMO)
Il seguente esempio rimuove la registrazione Publisher presso il Distributore, elimina il database della Distribuzione e disinstalla il Distributore.
// 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
Il seguente esempio disinstalla il Distributore senza prima disabilitare i database di pubblicazioni locali o rimuovere il database di distribuzione.
// 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