Hello,
I try to setup Peer-to-Peer replication with RMO, but ultimately it is not working because INSERT/UPDATE/DELETE stored procedures are not created. If anyone know what I am missing, I would much appreciate a response. Here's the code I use:
Setting up publication and articles:
using ( var connection = new PublicationContext( db ) )
{
var publicationDb = new ReplicationDatabase( connection.DatabaseName, connection );
if ( !publicationDb.LoadProperties() )
{
throw new ApplicationException( "The database doesn't exist." );
}
if ( !publicationDb.EnabledTransPublishing )
{
publicationDb.EnabledTransPublishing = true;
}
if ( !publicationDb.LogReaderAgentExists )
{
publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = true;
publicationDb.CreateLogReaderAgent();
}
var publication = connection.Publication;
publication.Type = PublicationType.Transactional;
publication.Status = State.Active;
publication.ContinueOnConflict = true;
publication.Attributes = PublicationAttributes.AllowPull | PublicationAttributes.AllowPush | PublicationAttributes.EnabledForPeerToPeer
| PublicationAttributes.ImmediateSync | PublicationAttributes.IndependentAgent
| PublicationAttributes.SnapshotInDefaultFolder | PublicationAttributes.AutomaticGenerateSyncProcedures
| PublicationAttributes.AllowInitializationFromBackup;
publication.SetPeerConflictDetection( true, peerId );
if ( !publication.IsExistingObject )
{
publication.Create();
}
foreach ( string table in tables )
{
var article = new TransArticle
{
ConnectionContext = connection,
Name = table,
DatabaseName = connection.DatabaseName,
SourceObjectName = table,
SourceObjectOwner = "dbo",
DestinationObjectName = table,
DestinationObjectOwner = "dbo",
PublicationName = PublicationName,
CommandFormat = CommandOptions.BinaryParameters | CommandOptions.IncludeInsertColumnNames,
SchemaOption = CreationScriptOptions.PrimaryObject
| CreationScriptOptions.CustomProcedures
| CreationScriptOptions.Identity
| CreationScriptOptions.KeepTimestamp
| CreationScriptOptions.ClusteredIndexes
| CreationScriptOptions.NonClusteredIndexes
| CreationScriptOptions.DriPrimaryKey
| CreationScriptOptions.UserTriggers
| CreationScriptOptions.DriChecks
| CreationScriptOptions.DriDefaults
| CreationScriptOptions.Collation
| CreationScriptOptions.DriUniqueKeys
| CreationScriptOptions.MarkReplicatedCheckConstraintsAsNotForReplication
| CreationScriptOptions.MarkReplicatedForeignKeyConstraintsAsNotForReplication
| CreationScriptOptions.Schema
};
if ( !article.IsExistingObject )
{
article.Create();
}
}
}
Setting up subscriptions:
using ( var connection = new PublicationContext( publicationDb ) )
{
var publication = connection.Publication;
using ( var subscriptionConnection = new ConnectionContext( subscriptionDb ) )
{
if ( pullSubscription )
{
var subscription = CreatePullSubscription( subscriptionConnection, publication );
subscription.CreateSyncAgentByDefault = true;
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Continuously;
subscription.Create();
if ( !publication.EnumSubscriptions().Cast<TransSubscription>()
.Any( s =>
s.SubscriberName == subscriptionConnection.ServerInstance&& s.SubscriptionDBName == subscription.DatabaseName ) )
{
publication.MakePullSubscriptionWellKnown( subscriptionConnection.ServerInstance,
subscription.DatabaseName,
SubscriptionSyncType.ReplicationSupportOnly,
TransSubscriberType.ReadOnly );
}
}
else
{
var subscription = CreatePushSubscription( subscriptionConnection, publication );
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Continuously;
subscription.Create();
}
}
}
Where CreatePullSubscription and CreatePushSubcription are defined as follows:
private static TransPullSubscription CreatePullSubscription( ConnectionContext connection, TransPublication publication )
{
return new TransPullSubscription
{
ConnectionContext = connection,
PublisherName = publication.ConnectionContext.ServerInstance,
PublicationName = PublicationName,
PublicationDBName = publication.DatabaseName,
DatabaseName = connection.DatabaseName
};
}
private static TransSubscription CreatePushSubscription( ConnectionContext connection, TransPublication publication )
{
return new TransSubscription
{
ConnectionContext = publication.ConnectionContext,
SubscriberName = connection.ServerInstance,
PublicationName = PublicationName,
DatabaseName = publication.DatabaseName,
SubscriptionDBName = connection.DatabaseName,
SyncType = SubscriptionSyncType.ReplicationSupportOnly
};
}
When I setup P2P replication on exactly the same databases and their state (using VM snapshot) through Sql Server Management Studio, the stored procedures are generated.
Best regards,
Tadeusz Dracz
Tadeusz Dracz