SQL Server RMO - 创建发布时出错

时间:2013-03-25 19:26:29

标签: c#-4.0 sql-server-2008-r2 database-replication rmo

我有以下情况:分发为分发服务器数据库,production1作为发布数据库,production2作为订阅者。当我尝试通过C#RMO创建发布时,会发生以下错误:

  

无法将值NULL插入列'pubid',表'production1.dbo.IHpublications';列不允许空值。 INSERT失败。\ r \ n无法创建发布。\ r \ n更改数据库上下文为'production1'。\ r \ n语句已终止。

代码附在下面 - 从MSDN中获取:

        // Set the Publisher, publication database, and publication names.
        string publicationName = "productionTran";
        string publicationDbName = "production1";
        string publisherName = "OSKAR-KOMPUTER";

        ReplicationDatabase publicationDb;
        TransPublication publication;

        // Create a connection to the Publisher using Windows Authentication.
        ServerConnection conn;
        conn = new ServerConnection(publisherName);


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

            // Enable the AdventureWorks database for transactional publishing.
            publicationDb = new ReplicationDatabase(publicationDbName, conn);

            // If the database exists and is not already enabled, 
            // enable it for transactional publishing.
            if (publicationDb.LoadProperties())
            {
                if (!publicationDb.EnabledTransPublishing)
                {
                    publicationDb.EnabledTransPublishing = true;
                }

                // If the Log Reader Agent does not exist, create it.
                if (!publicationDb.LogReaderAgentExists)
                {
                    // Specify the Windows account under which the agent job runs.
                    // This account will be used for the local connection to the 
                    // Distributor and all agent connections that use Windows Authentication.
                    //publicationDb.LogReaderAgentProcessSecurity.Login = winLogin;
                    //publicationDb.LogReaderAgentProcessSecurity.Password = winPassword;

                    // Explicitly set authentication mode for the Publisher connection
                    // to the default value of Windows Authentication.
                    publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = true;

                    // Create the Log Reader Agent job.
                    publicationDb.CreateLogReaderAgent();
                }
            }
            else
            {
                throw new ApplicationException(String.Format(
                    "The {0} database does not exist at {1}.",
                    publicationDb, publisherName));
            }

            // Set the required properties for the transactional publication.
            publication = new TransPublication();
            publication.ConnectionContext = conn;
            publication.Name = publicationName;
            publication.DatabaseName = publicationDbName;

            // Specify a transactional publication (the default).
            publication.Type = PublicationType.Transactional;

            // Activate the publication so that we can add subscriptions.
            publication.Status = State.Active;

            // Enable push and pull subscriptions and independent Distribition Agents.
            publication.Attributes |= PublicationAttributes.AllowPull;
            publication.Attributes |= PublicationAttributes.AllowPush;
            publication.Attributes |= PublicationAttributes.IndependentAgent;

            // Specify the Windows account under which the Snapshot Agent job runs.
            // This account will be used for the local connection to the 
            // Distributor and all agent connections that use Windows Authentication.
           // publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
          //  publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

            // Explicitly set the security mode for the Publisher connection
            // Windows Authentication (the default).
            publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

            if (!publication.IsExistingObject)
            {
                // Create the transactional publication.
                publication.Create();

                // Create a Snapshot Agent job for the publication.
                publication.CreateSnapshotAgent();
            }
            else
            {
                throw new ApplicationException(String.Format(
                    "The {0} publication already exists.", publicationName));
            }
        }

        catch (Exception ex)
        {
            // Implement custom application error handling here.
            throw new ApplicationException(String.Format(
                "The publication {0} could not be created.", publicationName), ex);
        }
        finally
        {
            conn.Disconnect();
        }

我可以说更多,分销商和广告商已安装。有任何想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。 在我要发布的数据库上运行以下命令对我有用。

DROP TABLE dbo.iharticles;
DROP TABLE dbo.ihcolumns;
DROP TABLE dbo.ihconstrainttypes;
DROP TABLE dbo.ihindextypes;
DROP TABLE dbo.ihpublications;
DROP TABLE dbo.ihpublishercolumnconstraints;
DROP TABLE dbo.ihpublishercolumnindexes;
DROP TABLE dbo.ihpublishercolumns;
DROP TABLE dbo.ihpublisherconstraints;
DROP TABLE dbo.ihpublisherindexes;
DROP TABLE dbo.ihpublishers;
DROP TABLE dbo.ihpublishertables;
DROP TABLE dbo.ihsubscriptions;
DROP TABLE dbo.syssubscriptions
DROP VIEW dbo.syspublications;
DROP VIEW dbo.sysarticlecolumns;
DROP VIEW dbo.syssubscriptions;
DROP VIEW dbo.sysextendedarticlesview;
DROP VIEW dbo.ihextendedarticleview;
DROP VIEW dbo.ihextendedsubscriptionview;

然后我使用向导禁用发布,然后使用向导重新启用它并能够创建发布。