MS sql server 2012上的排序规则更改

时间:2015-09-29 11:23:10

标签: sql-server database sql-server-2012 collation

亲爱的,目前我正在研究如何处理数据库中排序规则的更改。

  

有人做出了一个不寻常的决定,创建适合全球使用的重音敏感数据库......但我正在处理这个问题!

原因:改变整理是数据库包含从不同国家收集的数据,而且我们都知道一些文化有自己的字母。

尊重客户,我们的组织希望拥有Accent Insensitive数据库。这将允许用户从服务器请求数据,没有使用本地字符的任何限制。

据我所知,可能有一个选项可以删除约束等等。更改排序规则然后只需将所有内容都恢复原状。在这种情况下,我担心这是否足以影响已有的数据(列)。

另一方面,我在Collation change on 2005 and 2008 server找到了一篇文章。但是,这不包括2012服务器。

此外,我也考虑了这个例子的复杂性。

我相信我不是一个容易的阶段。但我希望得到一些建议,这是最好和最安全的方法来解决这个问题。

感谢您的关注和帮助。

  

更新让我添加我们拥有的架构:整个系统包含4个数据库和超过1.000个表。所以我的期望是并非所有可能的方式都可以以最佳方式工作。

3 个答案:

答案 0 :(得分:0)

由于不同的原因,我也不得不处理类似的问题:很久以前在SQL6.5服务器上安装了旧的SQL排序规则的古老数据库,该服务器已针对从sql 7到sql 2005的每个版本进行了升级。现在应该更新到sql 2012。

为什么所有这些就地升级?因为实际的排序规则是服务器排序规则并且很旧,在最近版本(2000+)的sql server的安装过程中不可用...

我决定丢弃所有那些旧垃圾,所以我必须找到一种方法,允许我转移到带有Windows排序规则的新安装。

我不得不排除数据迁移(创建新数据库和导入数据),因为缺少文档和大量的自定义,触发器,隐藏规则等。

我使用的解决方案(订单很重要):

  • 禁用自动统计信息生成
  • 编写所有外键的创建,然后删除它们
  • 脚本唯一索引和主索引,然后删除它们
  • 编写所有剩余索引的脚本然后删除它们
  • 脚本自定义统计信息然后删除它们
  • 脚本CHECKDEFAULT约束,然后删除它们

现在您可以运行更改列的排序规则所需的ALTER命令,并更改数据库本身的排序规则。

完成后以相反的顺序重复上述步骤以重建所有需要的对象 碰巧的是,如果数据库是如此古老,你可能会遇到像existing foreign key that references fields with different datatypes这样的搞笑事件。

答案 1 :(得分:0)

更改所有现有列的排序规则真的很痛苦。我建议并行迁移,而不是单独更改每个列。使用仅包含空表的所需排序规则创建新数据库。使用INSERT...SELECT(或您选择的ETL工具)将数据从旧数据库复制到新数据库,然后创建约束,索引和其他数据库对象。

考虑upvoting Make it easy to change collation on a database SQL Server功能请求。

答案 2 :(得分:0)

互联网上有许多复杂的解决方案可用于内部整理更改,但我们发现最简单(也是最安全)的方法是编写数据库脚本,更改脚本以创建一个新的数据库,并在开始时设置排序规则然后将数据导入新数据库。

我们使用MS SQL Server 2012 Management Studio以下列方式实现此目的:

  1. 使用任务编写所有数据库对象 - >生成脚本 - >脚本整个数据库和所有数据库对象
  2. 使用以下2个更改更改脚本,然后运行它以创建新数据库:

    a)将DB名称更改为MY-NEW-DB

    b)在CREATE DATABASE语句下添加:ALTER DATABASE [MY-NEW-DB]整理Latin1_General_CS_AS

  3. 如果需要,使用RG SQL Compare之类的工具来比较旧数据库和新数据库,以验证所有索引,约束,类型等是否相同,并且只更改相关列的排序规则。
  4. 运行任务 - >导入数据,确保选中“启用标识插入”。所有数据都正确地传输到新的区分大小写的数据库。
  5. 如果要检查一致性,请运行DBCC CHECKDB