改变sql server数据库的大小写敏感度

改变sql server数据库的大小写敏感度,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,当我试图将数据库排序规则从不区分大小写改为区分大小写时,我得到一个错误,如下所示: Msg 5030,级别16,状态2,第1行无法访问数据库 独占锁定以执行该操作。Msg 5072,16级,状态 1,第1行ALTER数据库失败。数据库的默认排序规则 “电子邮件”不能设置为SQL\u Latin1\u General\u CP1\u CS\u AS 请帮助我修复此问题我猜您仍然有大量使用该数据库的连接,这会阻止它被锁定以更改排序规则。因此,这部分错误: 无法以独占方式锁定数据库以执行该操作 所以,

当我试图将数据库排序规则从不区分大小写改为区分大小写时,我得到一个错误,如下所示:

Msg 5030,级别16,状态2,第1行无法访问数据库 独占锁定以执行该操作。Msg 5072,16级,状态 1,第1行ALTER数据库失败。数据库的默认排序规则 “电子邮件”不能设置为SQL\u Latin1\u General\u CP1\u CS\u AS


请帮助我修复此问题

我猜您仍然有大量使用该数据库的连接,这会阻止它被锁定以更改排序规则。因此,这部分错误:

无法以独占方式锁定数据库以执行该操作

所以,你需要

  • 安排一些停机时间
  • 通知用户
  • 将数据库设置为单用户模式(以防止其他连接和锁定)
  • 然后运行alterdatabase语句
类似于

ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
GO 

ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS; 
GO 

ALTER DATABASE [e_mail] SET MULTI_USER; 
GO 

如果这是一个生产数据库,这将是一项重大任务,是一个比表面上看起来更重要的变化。这可能是您可以进行的最复杂的更改之一,因为它会影响数据库中的所有现有字符串列。如果您仍在开发中,那么老实说,编写模式和数据值的脚本并在新数据库中重新开始可能会更容易

为什么这么复杂?主要是因为更改数据库排序规则不具有追溯力。它不会更改现有对象(表、视图、UDF等)的排序规则。相反,如果每个对象引用字符字段,则需要修改每个对象以更正它。如果字符字段上有索引、主键或外键或约束,则可能需要先删除索引、约束或键,然后才能更改排序规则,然后再重新添加对象。您还应该确保,当
Ohio
Ohio
突然成为等效值时,应用不区分大小写的排序规则不会创建重复的键值

此外,更改数据库级别设置不会更改服务器级别的排序规则(即主数据库的排序规则)。这意味着您的应用程序数据库可能没有与master和tempdb数据库相同的排序规则。相应地计划和测试,因为如果使用tempdb,可能会导致错误。您可以更改tempdb上的排序规则,但更改主数据库上的排序规则是。。。这并非不可能,但它甚至不如更改用户数据库的排序规则那么简单

有几个自定义SQL脚本包含不同级别的逻辑来处理此问题,但如果不生成脚本、读取整个脚本,然后在测试环境中彻底测试,我不会自动将数据信任给其中任何一个脚本

微软的文档是。下面是直接回答问题和更改默认数据库排序规则所需运行的命令此操作将强制终止所有其他用户与数据库的所有活动连接,并回滚所有挂起的事务。

USE [master]
GO
ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [e_mail] SET SINGLE_USER 
GO
ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS
GO
ALTER DATABASE [e_mail] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [e_mail] SET MULTI_USER
GO

为什么要运行SET SINGLE_USER和SET MULTI_USER两次?只是因为根据我的经验,服务器有时会在您第一次更改用户模式后抛出错误。这可能是早期版本的错误、硬件配置问题或其他原因,但多年来,当我需要更改用户模式并立即运行需要单用户模式的命令时,我一直保持脚本不变,冗余并没有造成任何问题。

请注意,更改数据库排序规则不会更改任何现有列(仅新创建列)的排序规则,因此即使语句正常工作,您也可能会发现它没有达到预期效果。