查看和修改项目属性

适用于: SQL Server Azure SQL 托管实例

此主题介绍如何使用 SQL Server Management Studio、Transact-SQL 或复制管理对象 (RMO) 在 SQL Server 中查看和修改发布属性。

本主题内容

开始之前

限制和局限

  • 创建复制后,有些属性便不可以再进行修改,如果该发布存在订阅,则其他属性也无法再进行修改。 不能进行修改的属性将显示为只读。

建议

使用 SQL Server Management Studio

可在“发布属性 - <发布>”对话框(在 Microsoft SQL Server Management Studio 和复制监视器中可用)中查看和修改项目属性。 有关启动复制监视器的信息,请参阅启动复制监视器

  • “常规” 页,包含发布名称和说明、数据库名称、发布类型以及订阅过期设置。

  • “项目” 页,对应于新建发布向导中的 “项目” 页。 使用此页可添加和删除项目,以及更改项目的属性和列筛选。

  • “筛选行” 页,对应于新建发布向导中的 “筛选表行” 页。 使用此页可添加、编辑和删除所有发布类型的静态行筛选器,以及添加、编辑和删除合并发布的参数化行筛选器和联接筛选器。

  • “快照” 页,使您可以指定快照的格式和位置、快照是否压缩,以及应用快照前后要运行的脚本。

  • “FTP 快照” 页(适用于快照和事务发布,以及运行 SQL Server 2005 之前版本的发布服务器的合并发布),使您可以指定订阅服务器是否可以通过文件传输协议 (FTP) 下载快照文件。

  • “FTP 快照和 Internet” 页(适用于运行 SQL Server 2005 或更高版本的发布服务器的合并发布),使您可以指定订阅服务器是否可以通过 FTP 下载快照文件,以及订阅服务器是否可以通过 HTTPS 对订阅进行同步。

  • “订阅选项” 页,使您可以设置多个应用于所有订阅的选项。 这些选项会随着发布类型而有所不同。

  • “发布访问列表” 页,使您可以指定可以访问发布的登录名和组。

  • “代理安全性” 页,使您可以访问用于运行下列代理并连接复制拓扑中计算机的帐户设置:所有发布的快照代理、所有事务发布的日志读取器代理以及允许排队更新订阅的事务发布的队列读取器代理。

  • “数据分区” 页(适用于来自运行 SQL Server 2005 或更高版本的发布服务器的合并发布),使您可以指定在快照不可用时使用参数化筛选器的发布的订阅服务器是否可以请求快照。 它还允许一次性或按循环计划生成一个或多个分区的快照。

查看和修改项目属性

  1. 在“发布属性 - <发布>”对话框的“项目”页上,选择一个项目,然后单击“项目属性”。

  2. 选择要将更改应用于哪些项目属性:

    • 单击“设置突出显示的 <对象类型> 项目的属性”以启动“项目属性 - <对象名>”对话框;在此对话框中进行的属性更改仅应用于在“项目”页上的对象窗格中突出显示的对象。

    • 单击“设置所有 <对象类型> 项目的属性”以启动“所有 <对象类型> 项目的属性”对话框;在此对话框中进行的属性更改应用于“项目”页上的对象窗格中该类型的所有对象,包括尚未选择进行发布的对象。

      注意

      在“所有 <对象类型> 项目的属性”对话框中进行的属性更改会替代以前在“项目属性 - <对象名>”对话框中进行的任何更改。 例如,若要为某对象类型的所有项目设置一些默认值,但还希望为单个对象设置一些属性,请首先设置所有项目的默认值。 然后再设置单个对象的属性。

  3. 根据需要修改属性,然后单击 “确定”

  4. 在“发布属性 - <发布>”对话框中单击“确定”。

“使用 Transact-SQL”

可以使用复制存储过程以编程方式修改项目以及返回其属性。 使用的存储过程取决于项目所属的发布的类型。

查看属于快照发布或事务发布的项目的属性

  1. 执行 sp_helparticle,为 @publication 参数指定发布名称,并为 @article 参数指定项目的名称。 如果未指定 @article,将返回该发布中所有项目的信息。

  2. 为表项目执行 sp_helparticlecolumns 可列出基表中可用的所有列。

修改属于快照发布或事务发布的项目的属性

  1. 执行 sp_changearticle,指定 @property 参数中要更改的项目属性,以及 @value 参数中此属性的新值。

    注意

    如果更改需要生成新的快照,则还必须为 @force_invalidate_snapshot 指定值 1,并且如果更改需要初始化订阅服务器,则还必须为 @force_reinit_subscription 指定值 1。 有关更改时需要新快照或重新初始化的属性的详细信息,请参阅更改发布和项目属性

查看属于合并发布的项目的属性

  1. 执行 sp_helpmergearticle,为 @publication 参数指定发布名称,并为 @article 参数指定项目的名称。 如果未指定这些参数,将返回为发布或发布服务器中所有项目的信息。

  2. 为表项目执行 sp_helpmergearticlecolumn 可列出基表中可用的所有列。

修改属于合并发布的项目的属性

  1. 执行 sp_changemergearticle,指定 @property 参数中要更改的项目属性,以及 @value 参数中此属性的新值。

    注意

    如果更改需要生成新的快照,则还必须为 @force_invalidate_snapshot 指定值 1,并且如果更改需要初始化订阅服务器,则还必须为 @force_reinit_subscription 指定值 1。 有关更改时需要新快照或重新初始化的属性的详细信息,请参阅更改发布和项目属性

示例 (Transact-SQL)

此事务复制示例返回了已发布项目的属性。

DECLARE @publication AS sysname;
SET @publication = N'AdvWorksProductTran';

USE [AdventureWorks2022]
EXEC sp_helparticle
  @publication = @publication;
GO

此事务复制示例更改了已发布项目的架构选项。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @option AS int;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @option = (SELECT CAST(0x0000000002030073 AS int));

-- Change the schema options to replicate schema with XML.
USE [AdventureWorks2022]
EXEC sp_changearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'schema_option', 
  @value = @option,
  @force_invalidate_snapshot = 1;
GO

此合并复制示例返回了已发布项目的属性。

DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';

USE [AdventureWorks2022]
EXEC sp_helpmergearticle
  @publication = @publication;
GO

此合并复制示例更改了发布项目的冲突检测设置。

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @article = N'SalesOrderHeader';

-- Enable column-level conflict tracking.
-- Changing this property requires that existing subscriptions
-- be reinitialized and that a new snapshot be generated.
USE [AdventureWorks2022]
EXEC sp_changemergearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'column_tracking', 
  @value = N'true',
  @force_invalidate_snapshot = 1,
  @force_reinit_subscription = 1;
GO

使用复制管理对象 (RMO)

可以使用复制管理对象 (RMO) 以编程方式修改项目以及访问其属性。 用于查看或修改项目属性的 RMO 类取决于项目所属的发布的类型。

查看或修改属于快照发布或事务发布的项目的属性

  1. 使用 ServerConnection 类创建与发布服务器的连接。

  2. 创建 TransArticle 类的一个实例。

  3. 设置 NamePublicationNameDatabaseName 属性。

  4. ConnectionContext 属性设置步骤 1 中的连接。

  5. 调用 LoadProperties 方法获取该对象的属性。 如果此方法返回 false,则说明步骤 3 中的项目属性定义不正确或此项目不存在。

  6. (可选)若要更改属性,请为可以设置的 TransArticle 属性中的一个设置新值。

  7. (可选)如果已将 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges 的值指定为 CachePropertyChanges,则调用 CommitPropertyChanges 方法以在服务器上提交更改。 如果将 false 的值指定为 CachePropertyChanges (默认值),则会将更改立即发送到服务器。

查看或修改属于合并发布的项目的属性

  1. 使用 ServerConnection 类创建与发布服务器的连接。

  2. 创建 MergeArticle 类的一个实例。

  3. 设置 NamePublicationNameDatabaseName 属性。

  4. ConnectionContext 属性设置步骤 1 中的连接。

  5. 调用 LoadProperties 方法获取该对象的属性。 如果此方法返回 false,则说明步骤 3 中的项目属性定义不正确或此项目不存在。

  6. (可选)若要更改属性,请为可以设置的 MergeArticle 属性中的一个设置新值。

  7. (可选)如果已将 P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges 的值指定为 CachePropertyChanges,则调用 CommitPropertyChanges 方法以在服务器上提交更改。 如果将 false 的值指定为 CachePropertyChanges (默认值),则会将更改立即发送到服务器。

示例 (RMO)

此示例更改一个合并项目来指定该项目所使用的业务逻辑处理程序。

// Define the Publisher, publication, and article names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string articleName = "SalesOrderHeader";

// Set the friendly name of the business logic handler.
string customLogic = "OrderEntryLogic";

MergeArticle article = new MergeArticle();

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

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

    // Set the required properties for the article.
    article.ConnectionContext = conn;
    article.Name = articleName;
    article.DatabaseName = publicationDbName;
    article.PublicationName = publicationName;

    // Load the article properties.
    if (article.LoadProperties())
    {
        article.ArticleResolver = customLogic;
    }
    else
    {
        // Throw an exception of the article does not exist.
        throw new ApplicationException(String.Format(
        "{0} is not published in {1}", articleName, publicationName));
    }
    
}
catch (Exception ex)
{
    // Do error handling here and rollback the transaction.
    throw new ApplicationException(String.Format(
        "The business logic handler {0} could not be associated with " +
        " the {1} article.",customLogic,articleName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication, and article names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim articleName As String = "SalesOrderHeader"

' Set the friendly name of the business logic handler.
Dim customLogic As String = "OrderEntryLogic"

Dim article As MergeArticle = New MergeArticle()

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

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

    ' Set the required properties for the article.
    article.ConnectionContext = conn
    article.Name = articleName
    article.DatabaseName = publicationDbName
    article.PublicationName = publicationName

    ' Load the article properties.
    If article.LoadProperties() Then
        article.ArticleResolver = customLogic
    Else
        ' Throw an exception of the article does not exist.
        Throw New ApplicationException(String.Format( _
         "{0} is not published in {1}", articleName, publicationName))
    End If

Catch ex As Exception
    ' Do error handling here and rollback the transaction.
    Throw New ApplicationException(String.Format( _
     "The business logic handler {0} could not be associated with " + _
     " the {1} article.", customLogic, articleName), ex)
Finally
    conn.Disconnect()
End Try