工作项状态也作迁入策略

        VSTF的工作项WorkItem本身也包含WorkFlow的信息,也就是说在一个WorkItem状态、指派人员等信息改变过程中要遵循一定的规则,这个规则可以由TFS(Team Foundation Server)的管理员作修改和扩充。那么,如果要限制程序员根据工作项迁入代码时也要满足一定条件,比如工作项状态必须是“已完成”,否则不允许迁入,该如何做到呢?幸运的是,Microsoft已经在TFS 对象模型中为我们提供了这样的控制接口。

         实际上,我们要做的仅是编写一个简单的自定义迁入策略类,然后将生成的dll注册到VSTF客户机的注册表中即可。该类必须继承自PolicyBase,它存在于Microsoft.TeamFoundation.VersionControl.Client命名空间中。如下图所示。

                      

 1. PolicyBase公共属性

  • CanEdit :获取该策略是否包含配置界面的标识。True,表明该策略包含配置界面。
  • Description: 获取该策略的描述。
  • InstallationInstructions: 获取或设置策略安装到目标机说明的文本描述。当策略的dll没有被注册时会在

             策略失败窗口中显示该信息。

  • Type: 获取描述该策略的字符串。
  • TypeDescription: 获取该策略类型的描述。

  2. PolicyBase公共方法

  • Activate: 如果用户双击策略失败信息时该方法被调用。
  • DisplayHelp: 当用户操作窗口中策略失败提示被激活时用户按F1该方法被调用,即显示帮助信息。
  • Edit :用以向用户显示有关迁入策略的对话框或其他界面窗口。
  • Evaluate :执行通常的策略评估。该方法其实是自定义迁入策略的核心,迁入控制规则必须在该方法的重写中实现。
  •  

  3.  PolicyBase公共事件

  •  PolicyStateChanged:策略状态改变事件,一般不使用,除非你想动态使用策略。

  4.  检查工作项状态迁入策略实现

       前面已经提到,自定义迁入策略实现的关键在于重写Evaluate 方法,当然你也可以根据需要重写其他属性和方法,这样在策略失败时可以在迁入对话框上显示一些定制的信息。迁入前判断工作项状态的代码实现如下所示的,当使用该策略时仅当关联工作项状态是“已完成”时才能够迁入代码。

        /// <summary>

         /// This method performs the actual evaluation.  It is called by the policy framework at various points in time
        /// when policy should be evaluated.  In this example, we invoke this method ourselves when various asyc
        /// events occur that may have invalidated the current list of failures.

        /// </summary>
        /// <returns></returns>
        public override PolicyFailure[] Evaluate()
        {
            List<PolicyFailure> list = new List<PolicyFailure>();
            bool flag = false;
            foreach (WorkItemCheckinInfo info in base.PendingCheckin.WorkItems.CheckedWorkItems)
            {
                if (info.WorkItem.Type.Name == "Founction Exception")
                {
                    if (info.WorkItem.State == "Finished")
                    {
                        flag = true;
                    }
                }
            }
            if (!flag)
            {
                list.Add(new PolicyFailure("The state of this type workitem unmatch this policy!", this));
            }
            return list.ToArray();
        }

     上面代码中 List<PolicyFailure>实际上是一个迁入策略失败信息的列表,最终会显示在用户代码迁入对话框的提示信息中,如下图所示。

       

5.  更近一步

如果说上面的自定义迁入策略代码还是在使用工作项对象的属性,不够灵活,那么我们还可以将工作项查询语句引入进来,对查询到的工作项集合进行操作,从而保证迁入策略得到最大限度的扩充,定制各种符合用户不同需要的迁入规则。下例就演示了一种迁入时必须关联代码Review工作项的自定义迁入策略。

public override PolicyFailure[] Evaluate()
{
      List<PolicyFailure> list1 = new List<PolicyFailure>();
      bool flag1 = false;
      bool flag2 = true;
      bool flag3 = true;
      foreach (WorkItemCheckinInfo info1 in base.PendingCheckin.WorkItems.CheckedWorkItems)
      {
            if (info1.WorkItem.get_Type().get_Name() == "Code Review")
            {
                  flag1 = true;
                  if ((info1.WorkItem.get_State() == "Closed") || (info1.WorkItem.get_State() == "Resolved"))
                  {
                        if (((string) info1.WorkItem.get_Fields().get_Item("Resolution").get_Value()) == "Approved")
                        {
                              foreach (Link link1 in info1.WorkItem.get_Links())
                              {
                                    RelatedLink link2 = link1 as RelatedLink;
                                    if (link2 != null)
                                    {
                                          object[] objArray1 = new object[] { link2.get_RelatedWorkItemId().ToString(CultureInfo.InvariantCulture) };
                                          WorkItemCollection collection1 = info1.WorkItem.get_Store().Query(string.Format(CultureInfo.InvariantCulture, "SELECT [System.Id] FROM WorkItems WHERE [System.Id] = '{0}' AND [System.WorkItemType] = 'Bug'", objArray1));
                                          if ((collection1.get_Count() == 1) && (collection1.get_Item(0).get_State() != "Closed"))
                                          {
                                                flag2 = false;
                                          }
                                    }
                              }
                              if (info1.WorkItem.get_State() == "Resolved")
                              {
                                    try
                                    {
                                          info1.WorkItem.set_State("Closed");
                                          info1.WorkItem.Save();
                                    }
                                    catch
                                    {
                                    }
                              }
                        }
                        else
                        {
                              flag3 = false;
                        }
                  }
            }
      }
      if (!flag1)
      {
            list1.Add(new PolicyFailure("There were no associated Code Review Work Items for this check in.", this));
      }
      if (!flag2)
      {
            list1.Add(new PolicyFailure("Associated bugs in Code Review work items were not closed.", this));
      }
      if (!flag3)
      {
            list1.Add(new PolicyFailure("Not all associated Code Review work items were marked as Approved.", this));
      }
      return list1.ToArray();
}

注:以上代码摘自http://www.gotdotnet.com/codegallery提供的范例。

 6.  自定义迁入策略的部署

  • 将检查工作项状态的迁入策略代码编译生成dll,copy到VSTF客户机上的某个目录中。
  • 在注册表[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/VisualStudio/8.0/TeamFoundation/SourceControl/Checkin Policies]下建字符串项,名称为CheckForStatePolicy(dll名称),值为该dll的物理路径如“c://CheckForStatePolicy.dll”。
  • 在VSTF中右键点击“项目”,在“团队项目设置”中选择“源代码管理设置”,点击“迁入策略”标签页并在“添加迁入策略”窗口中选择“Check For State Policy”项。
<think>我们正在处理一个关于数据库迁移的问题:如何将SQL Server数据库迁移到PostgreSQL。根据用户的问题,我们需要提供迁移的步骤和工具建议。同时,根据系统指令,我们需要在回答中引用提供的参考引用,并在引用的段落末尾自然地添加引用标识。 参考引用提供了几个工具和方法: 1. sqlserver2pgsql:一个基于Python的工具,用于迁移SQL Server的数据和结构到PostgreSQL。 2. pgloader:一个开源的高性能数据迁移工具,支持从多种数据库(包括SQL Server)迁移到PostgreSQL,具有自动模式转换、数据类型映射和并行加载等优势。 3. 迁移到Babelfish for RDS PostgreSQL:这是一种特殊的迁移场景,需要导出SQL Server数据库表对象和数据,然后迁移到Babelfish实例。 由于用户没有提到Babelfish,我们主要关注通用的迁移工具:sqlserver2pgsql和pgloader。 我们的回答将包括以下步骤: 1. 准备工作:备份数据、检查兼容性等。 2. 使用工具进行迁移:介绍两种工具的使用方法。 3. 迁移后验证:检查数据完整性和性能。 同时,根据系统指令,我们需要生成相关问题。 注意:在回答中,我们引用的内容需要添加引用标识,如[^1]、[^2]等。根据提供的引用,我们分配如下: - 引用[1]和[2]对应sqlserver2pgsql工具。 - 引用[3]对应pgloader工具。 - 引用[4]对应Babelfish迁移,但用户问题未提及,我们可以简要提及或忽略。由于用户问题明确是迁移到PostgreSQL,而Babelfish是兼容SQL Server的PostgreSQL扩展,如果用户需要同时支持SQL Server和PostgreSQL,可能会用到,但这里我们主要回答迁移到PostgreSQL,所以可以略过,或者为可选方案简单提及。 根据用户问题,我们主要介绍前两种工具。 回答结构: 1. 引言:简述迁移步骤。 2. 准备工作:包括备份、环境准备等。 3. 方法一:使用sqlserver2pgsql工具。 4. 方法二:使用pgloader工具。 5. 迁移后验证。 6. 相关问题。 注意:我们使用中文回答,数学表达式使用$...$,独立公式使用$$...$$(但本问题可能涉及较少数学公式,如果有则按规则处理),代码块使用```language...```格式。 由于数据库迁移是一个操过程,我们将提供具体的命令行或代码示例。 开始构建回答:</think>### 如何将 SQL Server 迁移到 PostgreSQL 迁移数据库需要系统化操,以下是关键步骤和工具建议: #### 一、迁移前准备 1. **备份数据库** 在 SQL Server Management Studio 中执行完整备份: ```sql BACKUP DATABASE [YourDB] TO DISK = 'D:\backup\YourDB.bak' ``` 2. **环境检查** - 确认 PostgreSQL 版本兼容性(建议 12+) - 检查数据类型映射(如 SQL Server 的 `DATETIME` → PostgreSQL 的 `TIMESTAMP`) - 识别不兼容功能(如 SQL Server 专属存储过程) 3. **安装迁移工具** 推荐选择以下开源工具: | 工具名称 | 优势 | 适用场景 | |----------------|-------------------------------|-----------------------| | sqlserver2pgsql| 纯 Python 实现,轻量级迁移 | 中小型数据库迁移 | | pgloader | 自动类型转换,支持并行加载 | 大型数据库/高性能需求 | #### 二、迁移实施步骤 **方法 1:使用 sqlserver2pgsql** ```bash # 克隆目 git clone https://gitcode.com/gh_mirrors/sq/sqlserver2pgsql # 执行迁移(示例) python sqlserver2pgsql.py \ -s your_sqlserver_instance \ -d target_postgres_db \ -u sa -p 'your_password' \ --schema-only # 先迁移结构 --data-only # 再迁移数据 ``` > 该工具自动处理表结构转换,但需手动校对存储过程等对象[^1][^2] **方法 2:使用 pgloader** ```lisp # 创建迁移配置文件 migrate.load LOAD DATABASE FROM mssql://user:pass@sqlserver_host/dbname INTO postgresql://user:pass@pg_host/dbname WITH include drop, create tables, reset sequences CAST type datetime to timestamptz drop default ``` ```bash # 执行迁移 pgloader migrate.load ``` > pgloader 自动转换索引/外键,并行加载速度提升 3-5 倍[^3] #### 三、迁移后验证 1. **数据完整性检查** ```sql -- PostgreSQL 端执行 SELECT COUNT(*) AS pg_count FROM table1; -- SQL Server 端对比 SELECT COUNT(*) AS mssql_count FROM table1; ``` $$ \text{验证条件:} |pg\_count - mssql\_count| = 0 $$ 2. **性能测试** - 执行关键查询对比响应时间 - 检查事务处理吞吐量差异 - 验证应用程序功能点 #### 四、特殊场景处理 - **函数/存储过程迁移**:需手动重写 T-SQL 为 PL/pgSQL - **大对象(LOB)处理**:使用 pgloader 的 `BLOB CASTING` 选 - **迁移失败回滚**:利用 PostgreSQL 的 PITR (Point-in-Time Recovery) > **重要提示**:生产环境迁移前必须在测试环境完成全流程验证,建议在业务低峰期操[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值