パブリッシングおよびディストリビューションの無効化
適用対象: SQL Server Azure SQL Managed Instance
ここでは、SQL Server Management Studio、Transact-SQL、またはレプリケーション管理オブジェクト (RMO) を使用して SQL Server でパブリッシングとディストリビューションを無効にする方法について説明します。
次の操作を実行できます。
ディストリビューターですべてのディストリビューション データベースを削除します。
ディストリビューターを使用するすべてのパブリッシャーを無効にし、それらのパブリッシャーのすべてのパブリケーションを削除します。
パブリケーションへのすべてのサブスクリプションを削除します。 パブリケーション データベースおよびサブスクリプション データベースのデータは削除されませんが、パブリケーション データベースとの同期リレーションシップは失われます。 サブスクライバーにあるデータを削除するには、手動で削除する必要があります。
このトピックの内容
作業を開始する準備:
パブリッシングおよびディストリビューションを無効にするために使用するもの:
始める前に
前提条件
- パブリッシングおよびディストリビューションを無効にするには、すべてのディストリビューション データベースおよびパブリケーション データベースをオンラインにする必要があります。 ディストリビューション データベースまたはパブリケーション データベースに対して、 データベース スナップショット が存在する場合、これらを削除してからパブリッシングおよびディストリビューションを無効にする必要があります。 データベース スナップショットは、データベースの読み取り専用のオフライン コピーで、レプリケーション スナップショットとは関連がありません。 詳細については、「データベース スナップショット (SQL Server)」を参照してください。
SQL Server Management Studio を使用する
パブリッシングとディストリビューションの無効化ウィザードを使用して、パブリッシングおよびディストリビューションを無効化します。
パブリッシングおよびディストリビューションを無効化するには
Microsoft SQL Server Management Studio でパブリッシャーまたはディストリビューターに接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを右クリックし、 [パブリッシングとディストリビューションの無効化]をクリックします。
パブリッシングとディストリビューションの無効ウィザードの手順に従って操作します。
Transact-SQL の使用
パブリッシングおよびディストリビューションは、レプリケーションのストアド プロシージャを使用してプログラムから無効にできます。
パブリッシングおよびディストリビューションを無効化するには
レプリケーション関連のすべてのジョブを停止します。 ジョブ名の一覧については、「 レプリケーション エージェントのセキュリティ モデル」の「SQL Server エージェントのエージェント セキュリティ」セクションを参照してください。
各サブスクライバーのサブスクリプション データベースに対して sp_removedbreplication を実行して、レプリケーション オブジェクトをデータベースから削除します。 このストアド プロシージャでは、ディストリビューターのレプリケーション ジョブは削除されません。
パブリッシャー側のパブリケーション データベースに対して、 sp_removedbreplication を実行して、レプリケーション オブジェクトをデータベースから削除します。
パブリッシャーがリモート ディストリビューターを使用している場合は、 sp_dropdistributorを実行します。
ディストリビューターで sp_dropdistpublisherを実行します。 このストアド プロシージャは、ディストリビューターに登録されている各パブリッシャーについて一度ずつ実行する必要があります。
ディストリビューターで sp_dropdistributiondb を実行して、ディストリビューション データベースを削除します。 このストアド プロシージャは、ディストリビューターの各ディストリビューション データベースについて実行する必要があります。 これにより、ディストリビューション データベースに関連付けられているキュー リーダー エージェント ジョブがすべて削除されます。
ディストリビューターで sp_dropdistributor を実行して、サーバーからディストリビューターの指定を削除します。
Note
sp_dropdistpublisher および sp_dropdistributorの実行前にレプリケーションのパブリッシング オブジェクトおよびディストリビューション オブジェクトがすべて削除されていなかった場合は、これらのプロシージャからエラーが返されます。 パブリッシャーまたはディストリビューターの削除時に、レプリケーション関連のオブジェクトをすべて削除するには、
@no_checks
パラメーターを 1 に設定する必要があります。 パブリッシャーまたはディストリビューターがオフラインになっているか、アクセスできない場合は、@ignore_distributor
パラメーターを 1 に設定して削除できます。ただし、パブリッシング オブジェクトおよびディストリビューション オブジェクトは削除されずに残るため、手動で削除する必要があります。
例 (Transact-SQL)
次の例は、サブスクリプション データベースからレプリケーション オブジェクトを削除するスクリプトです。
-- 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
次の例は、パブリッシャーおよびディストリビューターとして機能しているサーバー上のパブリッシングおよびディストリビューションを無効にし、ディストリビューション データベースを削除するスクリプトです。
-- 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
レプリケーション管理オブジェクト (RMO) の使用
パブリッシングおよびディストリビューションを無効化するには
ディストリビューターを利用するパブリケーションへのサブスクリプションをすべて削除します。 詳細については、「 Delete a Pull Subscription 」および「 Delete a Push Subscription」を参照してください。
パブリッシャーとディストリビューターが同じサーバーにある場合、ディストリビューターを利用するパブリケーションをすべて削除し、すべてのデータベースに対するパブリッシングを無効にします。 詳しくは、「 Delete a Publication」をご覧ください。
ServerConnection クラスを使用して、ディストリビューターへの接続を作成します。
DistributionPublisher クラスのインスタンスを作成します。 Name プロパティを指定し、手順 3. の ServerConnection オブジェクトを渡します。
(省略可) LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得し、パブリッシャーが存在することを確認します。 このメソッドが falseを返した場合、手順 4. で設定したパブリッシャーの名前が誤っていたか、このディストリビューターではこのパブリッシャーが使用されていません。
Remove メソッドを呼び出します。 パブリッシャーとディストリビューターが別々のサーバーにあり、パブリッシャーにパブリケーションが存在しないことを最初に確認せずにディストリビューターでパブリッシャーをアンインストールする必要がある場合は、 force に true を渡します。
ReplicationServer クラスのインスタンスを作成します。 手順 3 の ServerConnection オブジェクトを渡します。
UninstallDistributor メソッドを呼び出します。 force に true を渡すと、すべてのローカル パブリケーション データベースが無効になっているか、ディストリビューション データベースがアンインストールされているかどうかを最初に確認せずに、ディストリビューターのレプリケーション オブジェクトをすべて削除します。
例 (RMO)
次の例では、ディストリビューターのパブリッシャーの登録を削除し、ディストリビューション データベースを削除して、ディストリビューターをアンインストールします。
// 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
次の例では、最初にローカル パブリケーション データベースを無効にしたりディストリビューション データベースを削除せずに、ディストリビューターをアンインストールします。
// 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