ALTER DATABASE SET 选项 (Transact-SQL)

本主题包含与设置数据库选项有关的 ALTER DATABASE 语法。有关其他 ALTER DATABASE 语法,请参阅 ALTER DATABASE (Transact-SQL)。数据库镜像和兼容级别为 SET 选项,但由于它们的长度,在单独的主题中介绍它们。有关详细信息,请参阅 ALTER DATABASE 数据库镜像 (Transact-SQL)ALTER DATABASE 兼容级别 (Transact-SQL)

主题链接图标Transact-SQL 语法约定

语法

ALTER DATABASE database_name 
SET 
{
    { <optionspec> [ ,...n ] [ WITH <termination> ] }
}

<optionspec>::= 
{
    <auto_option> 
  | <change_tracking_option> 
  | <cursor_option> 
  | <database_mirroring_option>
  | <date_correlation_optimization_option>
  | <db_encryption_option>
  | <db_state_option>
  | <db_update_option> 
  | <db_user_access_option>
  | <external_access_option>
  | <parameterization_option>
  | <recovery_option> 
  | <service_broker_option>
  | <snapshot_option>
  | <sql_option> 
}

<auto_option> ::= 
{
    AUTO_CLOSE { ON | OFF } 
  | AUTO_CREATE_STATISTICS { ON | OFF } 
  | AUTO_SHRINK { ON | OFF } 
  | AUTO_UPDATE_STATISTICS { ON | OFF } 
  | AUTO_UPDATE_STATISTICS_ASYNC { ON | OFF }
}

<change_tracking_option> ::=
{
  CHANGE_TRACKING 
      { 
          = OFF
        | = ON [ ( <change_tracking_option_list > [ ,...n ] ) ] 
        | ( <change_tracking_option_list> [ ,...n ] )
      }
}

<change_tracking_option> ::=
{
    AUTO_CLEANUP = { ON | OFF } 
  | CHANGE_RETENTION = retention_period { DAYS | HOURS | MINUTES }
}

<cursor_option> ::= 
{
    CURSOR_CLOSE_ON_COMMIT { ON | OFF } 
  | CURSOR_DEFAULT { LOCAL | GLOBAL } 
}

<database_mirroring_option>ALTER DATABASE Database Mirroring<date_correlation_optimization_option> ::=
{
    DATE_CORRELATION_OPTIMIZATION { ON | OFF }
}

<db_encryption_option> ::=
    ENCRYPTION { ON | OFF }

<db_state_option> ::=
    { ONLINE | OFFLINE | EMERGENCY }

<db_update_option> ::=
    { READ_ONLY | READ_WRITE }

<db_user_access_option> ::=
    { SINGLE_USER | RESTRICTED_USER | MULTI_USER }

<external_access_option> ::=
{
    DB_CHAINING { ON | OFF }
  | TRUSTWORTHY { ON | OFF }
}
<parameterization_option> ::=
{
    PARAMETERIZATION { SIMPLE | FORCED }
}

<recovery_option> ::= 
{
    RECOVERY { FULL | BULK_LOGGED | SIMPLE } 
  | TORN_PAGE_DETECTION { ON | OFF }
  | PAGE_VERIFY { CHECKSUM | TORN_PAGE_DETECTION | NONE }
}

<service_broker_option> ::=
{
    ENABLE_BROKER
  | DISABLE_BROKER
  | NEW_BROKER
  | ERROR_BROKER_CONVERSATIONS
  | HONOR_BROKER_PRIORITY { ON | OFF}
}

<snapshot_option> ::=
{
    ALLOW_SNAPSHOT_ISOLATION { ON | OFF }
  | READ_COMMITTED_SNAPSHOT {ON | OFF }
}
<sql_option> ::= 
{
    ANSI_NULL_DEFAULT { ON | OFF } 
  | ANSI_NULLS { ON | OFF } 
  | ANSI_PADDING { ON | OFF } 
  | ANSI_WARNINGS { ON | OFF } 
  | ARITHABORT { ON | OFF } 
  | COMPATIBILITY_LEVEL = { 80 | 90 | 100 }
  | CONCAT_NULL_YIELDS_NULL { ON | OFF } 
  | NUMERIC_ROUNDABORT { ON | OFF } 
  | QUOTED_IDENTIFIER { ON | OFF } 
  | RECURSIVE_TRIGGERS { ON | OFF } 
}

<termination> ::= 
{
    ROLLBACK AFTER integer [ SECONDS ] 
  | ROLLBACK IMMEDIATE 
  | NO_WAIT
}

参数

<auto_option>::=

控制自动选项。

  • database_name
    要修改的数据库的名称。

  • AUTO_CLOSE { ON | OFF }

    • ON
      在最后一个用户退出后,数据库完全关闭,其资源得到释放。

      当用户尝试再次使用该数据库时,该数据库将自动重新打开。例如,当用户通过发出 USE database_name 语句尝试使用该数据库时就是如此。如果数据库在 AUTO_CLOSE 设置为 ON 时完全关闭,则该数据库不会重新打开,直到下一次数据库引擎重新启动时,用户试图使用该数据库为止。 

    • OFF
      在最后一个用户退出后,数据库仍然保持打开状态。

    AUTO_CLOSE 选项允许将数据库文件作为常规文件进行管理,因此,该选项对于桌面数据库很有用。它们可以移动、复制以制作备份,或者甚至通过电子邮件发送给其他用户。

    注意注意

    在 SQL Server 的早期版本中,AUTO_CLOSE 是一个同步进程,当与数据库引擎反复连接并不断中断连接的应用程序访问数据库时,将会导致性能下降。从 SQL Server 2005 开始,AUTO_CLOSE 进程为异步进程;反复打开和关闭数据库不再会降低性能。

    可通过查看 sys.databases 目录视图中的 is_auto_close_on 列或 DATABASEPROPERTYEX 函数的 IsAutoClose 属性来确定此选项的状态。

    注意注意

    当 AUTO_CLOSE 为 ON 时,由于该数据库不可用于检索数据,因此 sys.databases 目录视图中的某些列和 DATABASEPROPERTYEX 函数将返回 NULL。若要解决此问题,请执行 USE 语句打开数据库。

    注意注意

    数据库镜像要求将 AUTO_CLOSE 设置为 OFF。

    数据库设置为 AUTOCLOSE = ON 时,启动数据库自动关闭的操作将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。在 SQL Server 2005 Service Pack 2 中,对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新”。只要每五分钟内缓存得到刷新,此消息就将每五分钟记录一次。

  • AUTO_CREATE_STATISTICS { ON | OFF }

    • ON
      查询优化器根据需要在查询谓词中的单列上创建统计信息,以便改进查询计划和查询性能。在查询优化器编译查询时创建这些单列统计信息。这些单列统计信息只在尚不是现有统计信息对象的第一列的列上创建。

      默认值为 ON。建议您对于大多数数据库使用默认设置。

    • OFF
      查询优化器在编译查询时不在查询谓词中的单列上创建统计信息。将此选项设置为 OFF 可能导致并非最佳的查询计划以及查询性能下降。

    可通过查看 sys.databases 目录视图中的 is_auto_create_stats_on 列或 DATABASEPROPERTYEX 函数的 IsAutoCreateStatistics 属性来确定此选项的状态。

    有关详细信息,请参阅使用统计信息提高查询性能中的“使用数据库范围的统计信息选项”部分。

  • AUTO_SHRINK { ON | OFF }

    • ON
      数据库文件是定期收缩的候选项。

      数据文件和日志文件都可以自动收缩。只有在数据库设置为 SIMPLE 恢复模式时,或事务日志已备份时,AUTO_SHRINK 才可减小事务日志的大小。当设置为 OFF 时,在定期检查未使用空间的过程中,数据库文件不自动收缩。

      当文件中超过百分之二十五的部分包含未使用的空间时,AUTO_SHRINK 选项将导致收缩文件。文件将收缩至未使用空间占文件 25% 的大小,或收缩至文件创建时的大小,以两者中较大者为准。

      不能收缩只读数据库。

    • OFF
      在定期检查未使用空间时不会自动收缩数据库文件。

    可通过查看 sys.databases 目录视图中的 is_auto_shrink_on 列或 DATABASEPROPERTYEX 函数的 IsAutoShrink 属性来确定此选项的状态。

  • AUTO_UPDATE_STATISTICS { ON | OFF }

    • ON
      指定在统计信息由查询使用并且可能过期时,查询优化器更新统计信息。统计信息将在插入、更新、删除或合并操作更改表或索引视图中的数据分布后过期。查询优化器通过计算自最后统计信息更新后数据修改的次数并且将这一修改次数与某一阈值进行比较,确定统计信息何时可能过期。该阈值基于表中或索引视图中的行数。

      查询优化器在编译查询和执行缓存查询计划前,检查是否存在过期的统计信息。在编译某一查询前,查询优化器使用查询谓词中的列、表和索引视图确定哪些统计信息可能过期。在执行缓存查询计划前,数据库引擎 确认该查询计划引用最新的统计信息。

      AUTO_UPDATE_STATISTICS 选项适用于为索引创建的统计信息、查询谓词中的单列以及使用 CREATE STATISTICS 语句创建的统计信息。此选项也适用于筛选的统计信息。

      默认值为 ON。建议您对于大多数数据库使用默认设置。

      使用 AUTO_UPDATE_STATISTICS_ASYNC 选项可以指定统计信息是同步更新还是异步更新。

    • OFF
      指定在统计信息由查询使用并且可能过期时,查询优化器不更新统计信息。将此选项设置为 OFF 可能导致并非最佳的查询计划以及查询性能下降。

    可通过查看 sys.databases 目录视图中的 is_auto_update_stats_on 列或 DATABASEPROPERTYEX 函数的 IsAutoUpdateStatistics 属性来确定此选项的状态。

    有关详细信息,请参阅使用统计信息提高查询性能中的“使用数据库范围的统计信息选项”部分。

  • AUTO_UPDATE_STATISTICS_ASYNC { ON | OFF }

    • ON
      指定针对 AUTO_UPDATE_STATISTICS 选项的统计信息更新是异步的。查询优化器不等待统计信息更新完成即编译查询。

      除非已将 AUTO_UPDATE_STATISTICS 设置为 ON,否则将此选项设置为 ON 不会产生任何影响。

      默认情况下,AUTO_UPDATE_STATISTICS_ASYNC 选项设置为 OFF,并且查询优化器以同步方式更新统计信息。

    • OFF
      指定针对 AUTO_UPDATE_STATISTICS 选项的统计信息更新是同步的。查询优化器在编译查询前等待统计信息更新完成。

      除非已将 AUTO_UPDATE_STATISTICS 设置为 ON,否则将此选项设置为 OFF 不会产生任何影响。

    可通过查看 sys.databases 目录视图中的 is_auto_update_stats_async_on 列来确定此选项的状态。

    有关描述何时使用同步统计信息更新或异步统计信息更新的详细信息,请参阅使用统计信息提高查询性能中的“使用数据库范围的统计信息选项”部分。

<change_tracking_option>::=

控制更改跟踪选项。可以启用更改跟踪、设置选项、更改选项以及禁用更改跟踪。有关示例,请参阅本主题后面的“示例”一节。

  • ON
    对数据库启用更改跟踪。启用更改跟踪时,还可以设置 AUTO CLEANUP 和 CHANGE RETENTION 选项。

  • AUTO_CLEANUP = { ON | OFF }

    • ON
      在经过指定的保持期后会自动删除更改跟踪信息。

    • OFF
      不会从数据库中删除更改跟踪数据。

  • CHANGE_RETENTION =retention_period { DAYS | HOURS | MINUTES }
    指定在数据库中保留更改跟踪信息的最短期限。只有在 AUTO_CLEANUP 值为 ON 时,才会删除数据。

    retention_period 是一个整数,用于指定保持期的数值部分。

    默认保持期为 2 天。最短保持期为 1 分钟。

  • OFF
    对数据库禁用更改跟踪。必须先对所有表禁用更改跟踪,然后才能对数据库禁用更改跟踪。

<cursor_option>::=

控制游标选项。

  • CURSOR_CLOSE_ON_COMMIT { ON | OFF }

    • ON
      关闭在提交或回滚事务时打开的所有游标。

    • OFF
      在提交事务时游标保持打开状态;回滚事务则会关闭除了定义为 INSENSITIVE 或 STATIC 的游标以外的所有游标。

    连接级设置(使用 SET 语句设置)覆盖 CURSOR_CLOSE_ON_COMMIT 的默认数据库设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端会发出连接级别 SET 语句,将会话的 CURSOR_CLOSE_ON_COMMIT 设置为 OFF。有关详细信息,请参阅 SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

    可通过查看 sys.databases 目录视图中的 is_cursor_close_on_commit_on 列或 DATABASEPROPERTYEX 函数的 IsCloseCursorsOnCommitEnabled 属性来确定此选项的状态。

  • CURSOR_DEFAULT { LOCAL | GLOBAL }
    控制游标作用域是使用 LOCAL 还是 GLOBAL。

    • LOCAL
      如果指定了 LOCAL,而创建游标时没有将其定义为 GLOBAL,那么游标的作用域将局限于创建游标时所在的批处理、存储过程或触发器。游标名仅在该作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。当批处理、存储过程或触发器结束时,游标将被隐式释放,除非它在一个 OUTPUT 参数中传递回来。如果在 OUTPUT 参数中将此游标传递回来,此游标将在引用它的最后一个变量释放或离开作用域时释放。

    • GLOBAL
      如果指定了 GLOBAL,而创建游标时没有将其定义为 LOCAL,那么游标的作用域将是相应连接的全局范围。在由此连接执行的任何存储过程或批处理中,都可以引用该游标名称。

    该游标仅在断开连接时才被隐式释放。有关详细信息,请参阅 DECLARE CURSOR (Transact-SQL)

    可通过查看 sys.databases 目录视图中的 is_local_cursor_default 列或 DATABASEPROPERTYEX 函数的 IsLocalCursorsDefault 属性来确定此选项的状态。

<database_mirroring>

有关参数说明,请参阅 ALTER DATABASE 数据库镜像 (Transact-SQL)

<date_correlation_optimization_option> ::=

控制 date_correlation_optimization 选项。

  • DATE_CORRELATION_OPTIMIZATION { ON | OFF }

    • ON
      SQL Server 维护数据库中由 FOREIGN KEY 约束链接并包含 datetime 列的任意两个表之间的相关性统计信息。有关详细信息,请参阅优化访问相关 datetime 列的查询

    • OFF
      不维护相关性统计信息。

    若要将 DATE_CORRELATION_OPTIMIZATION 设置为 ON,则除了执行 ALTER DATABASE 语句的连接以外,该数据库必须没有其他活动连接。以后会支持多个连接。

    可通过查看 sys.databases 目录视图中的 is_date_correlation_on 列来确定此选项的当前设置。

<db_encryption_option>::=

控制数据库加密状态。

  • ENCRYPTION {ON | OFF}
    将数据库设置为加密的 (ON) 或未加密的 (OFF)。有关数据库加密的详细信息,请参阅了解透明数据加密 (TDE)

在数据库级别启用加密时,所有文件组都将进行加密。任何新的文件组都将继承加密的属性。如果数据库中的任何文件组设置为 READ ONLY,则数据库加密操作将失败。

可以使用 sys.dm_database_encryption_keys 动态管理视图来查看数据库的加密状态。

<db_state_option>::=

控制数据库的状态。

  • OFFLINE
    数据库已关闭、完全关闭并标记为脱机。数据库脱机时,不能进行修改。

  • ONLINE
    该数据库已打开且可用。

  • EMERGENCY
    数据库标记为 READ_ONLY,已禁用日志记录,并且仅限 sysadmin 固定服务器角色的成员进行访问。EMERGENCY 主要用于故障排除。例如,可以将由于损坏了日志文件而标记为可疑的数据库设置为 EMERGENCY 状态。这样,系统管理员便可对数据库进行只读访问。只有 sysadmin 固定服务器角色的成员才可以将数据库设置为 EMERGENCY 状态。

注意注意

权限:需要针对主题数据库的 ALTER DATABASE 权限,以便将数据库更改为脱机或紧急状态。需要服务器级别 ALTER ANY DATABASE 权限,以便将数据库从脱机状态移到联机状态。

可通过查看 sys.databases 目录视图中的 state 和 state_desc 列,或者查看 DATABASEPROPERTYEX 函数的 Status 属性,来确定此选项的状态。有关详细信息,请参阅数据库状态

无法将标记为 RESTORING 的数据库设置为 OFFLINE、ONLINE 或 EMERGENCY。在活动还原操作期间,或者当数据库还原操作或日志文件还原操作由于备份文件损坏而失败时,数据库可以处于 RESTORING 状态。有关详细信息,请参阅应对由损坏的备份导致的 SQL Server 还原错误

<db_update_option>::=

控制是否允许更新数据库。

  • READ_ONLY
    用户可以从数据库读取数据,但不能修改数据库。

  • READ_WRITE
    允许对数据库执行读写操作。

若要更改此状态,您必须对数据库有独占访问权限。有关详细信息,请参阅 SINGLE_USER 子句。

<db_user_access_option> ::=

控制用户对数据库的访问。

  • SINGLE_USER
    指定一次只能有一个用户可以访问数据库。如果指定了 SINGLE_USER,但已有其他用户连接到数据库,则 ALTER DATABASE 语句将被阻止,直到所有用户都断开与指定数据库的连接为止。若要取代此行为,请参阅 WITH <termination> 子句。

    即使设置此选项的用户已注销,数据库仍保持 SINGLE_USER 模式。这时,其他用户(但只能是一个)可以连接到数据库。

    在将数据库设置为 SINGLE_USER 之前,应验证 AUTO_UPDATE_STATISTICS_ASYNC 选项是否设置为 OFF。设置为 ON 时,用于更新统计信息的后台线程将与数据库建立连接,您将无法以单用户模式访问数据库。若要查看此选项的状态,请查询 sys.databases 目录视图中的 is_auto_update_stats_async_on 列。如果此选项设置为 ON,请执行以下任务:

    1. 将 AUTO_UPDATE_STATISTICS_ASYNC 设置为 OFF。

    2. 通过查询 sys.dm_exec_background_job_queue 动态管理视图来检查活动的异步统计信息作业。

    如果存在活动的作业,可以允许作业完成或通过使用 KILL STATS JOB 来手动终止这些作业。

  • RESTRICTED_USER
    RESTRICTED_USER 只允许 db_owner 固定数据库角色成员以及 dbcreator 和 sysadmin 固定服务器角色成员连接到数据库,不过对连接数没有限制。在 ALTER DATABASE 语句的终止子句所指定的时间范围内,所有数据库连接都将被断开。在数据库转换到 RESTRICTED_USER 状态后,不合格用户所做的连接尝试将被拒绝。

  • MULTI_USER
    所有拥有连接到数据库的相应权限的用户,都允许进行连接。

可通过查看 sys.databases 目录视图中的 user_access 列或 DATABASEPROPERTYEX 函数的 UserAccess 属性来确定此选项的状态。

<external_access_option>::=

控制是否允许外部资源(例如另一个数据库中的对象)访问数据库。

  • DB_CHAINING { ON | OFF }

    • ON
      数据库可以作为跨数据库所有权链的源或目标。

    • OFF
      数据库不能参与建立跨数据库所有权链。

    重要说明重要提示

    如果 cross db ownership chaining 服务器选项为 0 (OFF),SQL Server 实例将可以识别此设置。如果 cross db ownership chaining 为 1 (ON),则不论此选项为何值,所有用户数据库都可以参与跨数据库所有权链。此选项是通过使用 sp_configure 设置的。

    若要设置此选项,需要对数据库的 CONTROL SERVER 权限。不能针对下列系统数据库设置 DB_CHAINING 选项:master、model 和 tempdb。

    可通过查看 sys.databases 目录视图中的 is_db_chaining_on 列来确定此选项的状态。

    有关详细信息,请参阅所有权链

  • TRUSTWORTHY { ON | OFF }

    • ON
      使用模拟上下文的数据库模块(例如,用户定义函数或存储过程)可以访问数据库外部的资源。

    • OFF
      模拟上下文中的数据库模块不能访问数据库外部的资源。

    只要附加数据库,TRUSTWORTHY 就会设置为 OFF。

    默认情况下,除 msdb 数据库之外的所有系统数据库都将 TRUSTWORTHY 设置为 OFF。对于 model 和 tempdb 数据库,不能更改此值。建议在任何情况下都不要将 master 数据库的 TRUSTWORTHY 选项设置为 ON。

    若要设置此选项,需要对数据库的 CONTROL SERVER 权限。

    可通过查看 sys.databases 目录视图中的 is_trustworthy_on 列来确定此选项的状态。

<parameterization_option> ::=

控制参数化选项。

  • PARAMETERIZATION { SIMPLE | FORCED }

    • SIMPLE
      查询的参数化是根据数据库的默认行为进行的。有关详细信息,请参阅简单参数化

    • FORCED
      SQL Server 对数据库中的所有查询进行参数化。有关详细信息,请参阅强制参数化

    可通过查看 sys.databases 目录视图中的 is_parameterization_forced 列来确定此选项的当前设置。

<recovery_option> ::=

控制数据库恢复选项和磁盘 I/O 错误检查。

  • FULL
    通过使用事务日志备份,在介质发生故障后提供完整恢复。如果数据文件损坏,介质恢复可以还原所有已提交的事务。有关详细信息,请参阅在完整恢复模式下备份

  • BULK_LOGGED
    在某些大规模或大容量操作中,可以提供最佳性能,占用的日志空间也最少,因此,在介质发生故障后,可以提供恢复。有关大容量记入日志的操作的信息,请参阅可以尽量减少日志量的操作。在 BULK_LOGGED 恢复模式下,这些操作的日志记录最少。有关详细信息,请参阅在大容量日志恢复模式下备份

  • SIMPLE
    系统将提供占用日志空间最小的简单备份策略。服务器故障恢复不再需要的日志空间可被自动重用。有关详细信息,请参阅简单恢复模式下的备份

    重要说明重要提示

    简单恢复模式比其他两种模式更容易管理,但代价是数据文件损坏时丢失数据的风险也较大。最近的数据库备份或差异数据库备份之后的所有更改都将丢失,必须手动重新输入。

默认恢复模式由 model 数据库的恢复模式决定。有关选择适当恢复模式的详细信息,请参阅选择数据库恢复模式

可通过查看 sys.databases 目录视图中的 recovery_model 和 recovery_model_desc 列或 DATABASEPROPERTYEX 函数的 Recovery 属性来确定此选项的状态。

  • TORN_PAGE_DETECTION { ON | OFF }

    • ON
      数据库引擎可以检测不完整页。

    • OFF
      数据库引擎不能检测不完整页。

    重要说明重要提示

    在 SQL Server 的未来版本中,将删除语法结构 TORN_PAGE_DETECTION ON | OFF。请避免在新的开发工作中使用此语法结构,并计划修改当前使用此语法结构的应用程序。请改用 PAGE_VERIFY 选项。

  • PAGE_VERIFY { CHECKSUM | TORN_PAGE_DETECTION | NONE }
    发现磁盘 I/O 路径错误引起的损坏的数据库页面。磁盘 I/O 路径错误可能导致数据库损坏问题。这种错误通常是将该页面写入磁盘时发生的电源故障或磁盘硬件故障引起的。

    • CHECKSUM
      在向磁盘中写入页面时,计算整个页面内容的校验并将该值存储在页眉中。从磁盘中读取页时,将重新计算校验和,并与存储在页头中的校验和值进行比较。如果两个值不匹配,将同时在 SQL Server 错误日志和 Windows 事件日志中报告错误消息 824(指示校验和失败)。校验和失败指示存在 I/O 路径问题。若要确定其根本原因,需要调查硬件、固件驱动程序、BIOS、筛选器驱动程序(如防病毒软件)和其他 I/O 路径组件。

    • TORN_PAGE_DETECTION
      将页面写入磁盘时,将每个 512 字节扇区的特定 2 位模式保存在 8 KB 数据库页面中并存储在数据库页头中。从磁盘中读取页时,页头中存储的残缺位将与实际的页扇区信息进行比较。如果值不匹配,表明只有页面的一部分被写入磁盘。在这种情况下,将同时在 SQL Server 错误日志和 Windows 事件日志中报告错误消息 824(指示页撕裂错误)。如果页面写入确实不完整,则数据库恢复通常会检测到页撕裂。不过,其他 I/O 路径故障可能随时导致页撕裂。

    • NONE
      数据库页面写入不会生成 CHECKSUM 或 TORN_PAGE_DETECTION 值。在读取过程中,即使页头中存在 CHECKSUM 或 TORN_PAGE_DETECTION 值,SQL Server 也不会验证校验和或页撕裂。

    使用 PAGE_VERIFY 选项时,请考虑下列重要事项:

    • 在 SQL Server 2005 和 SQL Server 2008 中,默认设置为 CHECKSUM。在 SQL Server 2000 中,TORN_PAGE_DETECTION 是默认设置。

    • 在用户数据库或系统数据库升级到 SQL Server 2005 或 SQL Server 2008 后,将保留 PAGE_VERIFY 值(NONE 或 TORN_PAGE_DETECTION)。建议您使用 CHECKSUM。 

      注意注意

      在 SQL Server 的早期版本中,tempdb 数据库的 PAGE_VERIFY 数据库选项设置为 NONE 且不能修改。在 SQL Server 2008 中,对于全新安装的 SQL Server 的 tempdb 数据库,该默认值为 CHECKSUM。如果是升级安装 SQL Server,则默认值仍为 NONE。可以修改该选项。我们建议为 tempdb 数据库使用 CHECKSUM。

    • TORN_PAGE_DETECTION 可能使用较少资源,但提供的 CHECKSUM 保护最少。

    • 无需使数据库脱机、锁定数据库或以其他方式阻止对数据库的并发访问,即可设置 PAGE_VERIFY。

    • CHECKSUM 与 TORN_PAGE_DETECTION 互相排斥。不能同时启用这两个选项。

    检测到页撕裂或校验和失败时,如果失败仅限于索引页,则可通过还原数据进行恢复,可能还需要重建索引进行恢复。如果要在校验和失败的情况下确定受影响的一个或多个数据库页面的类型,请运行 DBCC CHECKDB。有关还原选项的详细信息,请参阅 RESTORE 参数 (Transact-SQL)。虽然还原数据可解决数据损坏问题,但应尽快诊断并纠正根本原因(如磁盘硬件故障),以防止继续出错。

    SQL Server 将对因校验和、页撕裂或其他 I/O 错误而失败的任何读取都重试四次。如果在其中一次重试中读取成功,则会向错误日志中写入一条消息,且触发读取的命令将继续执行。如果重试失败,则该命令失败,且显示错误消息 824。

    有关校验和、页撕裂、读取重试、错误消息 823 和 824 以及其他 SQL Server I/O 审核功能的详细信息,请参阅此 Microsoft 网站

    可通过查看 sys.databases 目录视图中的 page_verify_option 列或 DATABASEPROPERTYEX 函数的 IsTornPageDetectionEnabled 属性,确定此选项的当前设置。

<service_broker_option>::=

控制下列 Service Broker 选项:启用或禁用消息传递,设置新的 Service Broker 标识符,或者将会话优先级设置为 ON 或 OFF。有关消息传递和 Service Broker 标识符的详细信息,请参阅管理 Service Broker 标识。有关会话优先级别的详细信息,请参阅会话优先级。有关说明如何使用 HONOR_BROKER_PRIORITY 选项的示例,请参阅管理会话优先级

  • ENABLE_BROKER
    指定对指定的数据库启用 Service Broker。启动了消息传递,并且在 sys.databases 目录视图中将 is_broker_enabled 标志设置为 true。数据库保留现有的 Service Broker 标识符。

    注意注意

    ENABLE_BROKER 要求排他数据库锁。如果其他会话已锁定了数据库中的资源,ENABLE_BROKER 将等待其他会话释放其锁。若要在用户数据库中启用 Service Broker,请确保在运行 ALTER DATABASE SET ENABLE_BROKER 语句之前其他会话没有使用该数据库,例如,将该数据库置于单用户模式。若要在 msdb 数据库中启用 Service Broker,请首先停止 SQL Server 代理,这样 Service Broker 便可获得必要的锁。

  • DISABLE_BROKER
    指定对指定的数据库禁用 Service Broker。停止了消息传递,并且在 sys.databases 目录视图中将 is_broker_enabled 标志设置为 false。数据库保留现有的 Service Broker 标识符。

  • NEW_BROKER
    指定数据库应接收新的 Broker 标识符。由于该数据库被视为新的 Service Broker,所以将立即删除数据库中的所有现有会话,而不生成结束对话框消息。必须使用新标识符重新创建任何引用旧 Service Broker 标识符的路由。

  • ERROR_BROKER_CONVERSATIONS
    指定启用 Service Broker 消息传递。这将保留数据库的现有 Service Broker 标识符。Service Broker 结束数据库中的所有会话,并显示错误。这样,您的应用程序即可为现有会话执行定期清理。

  • HONOR_BROKER_PRIORITY {ON | OFF}

    • ON
      发送操作考虑到分配给会话的优先级别。先发送来自优先级别高的会话的消息,再发送来自所分配优先级别低的会话的消息。

    • OFF
      发送操作就像在所有会话都具有默认优先级别的情况下一样运行。

    对于新的对话框或没有等待发送的消息的对话框,对 HONOR_BROKER_PRIORITY 选项的更改会立即生效。在 ALTER DATABASE 运行时具有等待发送的消息的对话框在其部分消息完成发送前,不会接受新的设置。在所有对话框都开始使用新设置前等待的时间可能相差迥异。

    此属性的当前设置在 sys.databases 目录视图中的 is_broker_priority_honored 列中进行报告。

<snapshot_option>::=

确定事务隔离级别。

  • ALLOW_SNAPSHOT_ISOLATION { ON | OFF }

    • ON
      启用数据库级别的快照选项。启用该选项时,DML 语句开始生成行版本,即使没有事务使用快照隔离也是如此。启用此选项后,事务就可以指定 SNAPSHOT 事务隔离级别。当事务在 SNAPSHOT 隔离级别运行时,所有的语句都将数据快照视为位于事务的开头。如果在 SNAPSHOT 隔离级别运行的事务要访问多个数据库中的数据,则必须将所有数据库中的 ALLOW_SNAPSHOT_ISOLATION 都设置为 ON,或者事务中的每个语句都必须对 FROM 子句中对 ALLOW_SNAPSHOT_ISOLATION 设置为 OFF 的数据库中表的任何引用使用锁提示。

    • OFF
      禁用数据库级别的快照选项。事务不能指定 SNAPSHOT 事务隔离级别。

    在将 ALLOW_SNAPSHOT_ISOLATION 设置为新状态(从 ON 设置为 OFF,或从 OFF 设置为 ON)时,在数据库中的所有现有事务均已提交之前,ALTER DATABASE 不会将控制权返回给调用方。如果数据库已处于 ALTER DATABASE 语句所指定的状态,则控制权会立刻返回给调用方。如果 ALTER DATABASE 语句未迅速返回,请使用 sys.dm_tran_active_snapshot_database_transactions 确定是否存在长期运行的事务。如果 ALTER DATABASE 语句被取消,则数据库仍保持 ALTER DATABASE 开始时所处的状态。sys.databases 目录视图指示数据库中的快照隔离事务的状态。如果 snapshot_isolation_state_desc = IN_TRANSITION_TO_ON,则 ALTER DATABASE ALLOW_SNAPSHOT_ISOLATION OFF 将暂停六秒钟,然后重试操作。

    如果数据库处于 OFFLINE 状态,则不能更改 ALLOW_SNAPSHOT_ISOLATION 的状态。

    如果在 READ_ONLY 数据库中设置 ALLOW_SNAPSHOT_ISOLATION,则以后将数据库设置为 READ_WRITE 时,仍将保留该设置。

    可以为 master、model、msdb 和 tempdb 数据库更改 ALLOW_SNAPSHOT_ISOLATION 设置。如果为 tempdb 更改该设置,则每次停止并重新启动数据库引擎实例时会保留该设置。如果为 model 更改该设置,则该设置将成为除 tempdb 以外的所有新建数据库的默认设置。

    对于 master 和 msdb 数据库,默认情况下该选项设置为 ON。

    可通过查看 sys.databases 目录视图中的 snapshot_isolation_state 列来确定此选项的当前设置。

  • READ_COMMITTED_SNAPSHOT { ON | OFF }

    • ON
      启用数据库级别的 Read-Committed Snapshot 选项。启用该选项时,DML 语句开始生成行版本,即使没有事务使用快照隔离也是如此。启用此选项时,指定 read committed 隔离级别的事务将使用行版本控制而不是锁定。当事务在已提交读隔离级别运行时,所有的语句都将数据快照视为位于语句的开头。

    • OFF
      禁用数据库级别的 Read-Committed Snapshot 选项。指定 READ COMMITTED 隔离级别的事务使用锁定。

    若要将 READ_COMMITTED_SNAPSHOT 设置为 ON 或 OFF,不应存在任何活动的数据库连接,执行 ALTER DATABASE 命令的连接除外。但是,数据库不必一定要处于单用户模式下。当数据库处于 OFFLINE 状态时,不能更改此选项的状态。

    如果在 READ_ONLY 数据库中设置 READ_COMMITTED_SNAPSHOT,则以后将数据库设置为 READ_WRITE 时,仍将保留该设置。

    对于 master、tempdb 或 msdb 系统数据库,不能将 READ_COMMITTED_SNAPSHOT 设置为 ON。如果为 model 更改该设置,则该设置将成为除 tempdb 以外的所有新建数据库的默认设置。

    可通过查看 sys.databases 目录视图中的 is_read_committed_snapshot_on 列来确定此选项的当前设置。

<sql_option>::=

在数据库级别控制 ANSI 遵从选项。

  • ANSI_NULL_DEFAULT { ON | OFF }
    确定在 CREATE TABLE 或 ALTER TABLE 语句中未显式定义为 Null 性的别名数据类型CLR user-defined type 列的默认值(NULL 或 NOT NULL)。使用约束定义的列都将遵循约束规则,而与此设置无关。

    • ON
      默认值为 NULL。

    • OFF
      默认值为 NOT NULL。

    连接级设置(使用 SET 语句设置)覆盖 ANSI_NULL_DEFAULT 的默认数据库级别设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_NULL_DEFAULT 设置为 ON。有关详细信息,请参阅 SET ANSI_NULL_DFLT_ON (Transact-SQL)

    对于 ANSI 兼容性,数据库选项 ANSI_NULL_DEFAULT 设置为 ON 将使数据库默认设置改为 NULL。

    可通过查看 sys.databases 目录视图中的 is_ansi_null_default_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiNullDefault 属性来确定此选项的状态。

  • ANSI_NULLS { ON | OFF }

    • ON
      与 Null 值的所有比较的结果均为 UNKNOWN。

    • OFF
      将非 UNICODE 值与 Null 值比较时,如果这两个值都为 NULL,则结果为 TRUE。

    重要说明重要提示

    在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,将该选项显式设置为 OFF 的任何应用程序都将产生错误。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

    连接级设置(使用 SET 语句设置)覆盖 ANSI_NULLS 的默认数据库设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,以将会话的 ANSI_NULLS 设置为 ON。有关详细信息,请参阅 SET ANSI_NULLS (Transact-SQL)

    创建或更改计算列或索引视图的索引时,SET ANSI_NULLS 必须设置为 ON。

    可通过查看 sys.databases 目录视图中的 is_ansi_nulls_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiNullsEnabled 属性来确定此选项的状态。

  • ANSI_PADDING { ON | OFF }

    • ON
      在对字符串进行转换或将其插入 varchar 或 nvarchar 数据类型之前,会将字符串填充到同一长度。

      不剪裁插入 varchar 或 nvarchar 列中的字符值的尾随空格,也不剪裁插入 varbinary 列中的二进制值的尾随零。不将值填充到列的长度。

    • OFF
      剪裁 varchar 或 nvarchar 的尾随空格以及 varbinary 的尾随零。

    如果指定了 OFF,该设置只影响新列的定义。

    重要说明重要提示

    在 SQL Server 的未来版本中,ANSI_PADDING 将始终为 ON,将该选项显式设置为 OFF 的任何应用程序都将产生错误。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

    char(n) 和 binary(n) 列(允许为 Null 值)在 ANSI_PADDING 设置为 ON 时将填充到列长,而当 ANSI_PADDING 为 OFF 时,则将剪裁尾随空格和零。不允许为 Null 值的 char(n) and binary(n) 列将始终填充到列长。

    连接级设置(使用 SET 语句设置)覆盖 ANSI_PADDING 的默认数据库级别设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_PADDING 设置为 ON。有关详细信息,请参阅 SET ANSI_PADDING (Transact-SQL)

    重要说明重要提示

    建议始终将 ANSI_PADDING 设置为 ON。创建或操作计算列或索引视图的索引时,ANSI_PADDING 也必须为 ON。

    可通过查看 sys.databases 目录视图中的 is_ansi_padding_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiPaddingEnabled 属性来确定此选项的状态。

  • ANSI_WARNINGS { ON | OFF }

    • ON
      当出现被零除的情况或聚合函数中出现 Null 值时,将发出错误或警告。

    • OFF
      出现被零除等情况时不会引发警告,而是返回 Null 值。

    创建或更改计算列或索引视图的索引时,SET ANSI_WARNINGS 必须设置为 ON。

    连接级设置(使用 SET 语句设置)覆盖 ANSI_WARNINGS 的默认数据库设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将会话的 ANSI_WARNINGS 设置为 ON。有关详细信息,请参阅 SET ANSI_WARNINGS (Transact-SQL)

    可通过查看 sys.databases 目录视图中的 is_ansi_warnings_on 列或 DATABASEPROPERTYEX 函数的 IsAnsiWarningsEnabled 属性来确定此选项的状态。

  • ARITHABORT { ON | OFF }

    • ON
      在查询执行过程中出现溢出或被零除等错误时,结束查询。

    • OFF
      如果出现其中一个错误则显示警告消息,而查询、批处理或事务继续处理,就像没有发生错误一样。

    创建或更改计算列或索引视图的索引时,SET ARITHABORT 必须设置为 ON。

    可通过查看 sys.databases 目录视图中的 is_arithabort_on 列或 DATABASEPROPERTYEX 函数的 IsArithmeticAbortEnabled 属性来确定此选项的状态。

  • COMPATIBILITY_LEVEL { 80 | 90 | 100 }
    有关详细信息,请参阅 ALTER DATABASE 兼容级别 (Transact-SQL)

  • CONCAT_NULL_YIELDS_NULL { ON | OFF }

    • ON
      当串联运算的两个操作数中任意一个为 NULL 时,结果也为 NULL。例如,将字符串“This is”和 NULL 串联将得到 NULL 值,而不是值“This is”。

    • OFF
      Null 值被视为空字符串进行处理。

    创建或更改计算列或索引视图的索引时,CONCAT_NULL_YIELDS_NULL 必须设置为 ON。

    重要说明重要提示

    在 SQL Server 的未来版本中,CONCAT_NULL_YIELDS_NULL 将始终为 ON,而且将该选项显式设置为 OFF 的任何应用程序都将产生一个错误。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

    连接级设置(使用 SET 语句设置)覆盖 CONCAT_NULL_YIELDS_NULL 的默认数据库设置。默认情况下,当连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级别 SET 语句,将会话的 CONCAT_NULL_YIELDS_NULL 设置为 ON。有关详细信息,请参阅 SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)

    可通过查看 sys.databases 目录视图中的 is_concat_null_yields_null_on 列或 DATABASEPROPERTYEX 函数的 IsNullConcat 属性来确定此选项的状态。

  • QUOTED_IDENTIFIER { ON | OFF }

    • ON
      可以将分隔标识符包含在双引号中。

      所有用双引号分隔的字符串都被解释为对象标识符。加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。如果单引号 (') 是文字字符串的一部分,则可以用双引号 (") 表示它。

    • OFF
      标识符不能包含在引号中,而且必须遵循所有 Transact-SQL 标识符规则。文字可以由单引号或双引号分隔。

    SQL Server 还允许使用方括号 ([ ]) 分隔标识符。无论 QUOTED_IDENTIFIER 的设置如何,始终都可以使用用方括号括起来的标识符。有关详细信息,请参阅分隔标识符(数据库引擎)

    创建表后,QUOTED IDENTIFIER 选项在表的元数据中始终存储为 ON,即使在创建表时将该选项设置为 OFF 也不例外。

    连接级设置(使用 SET 语句设置)覆盖 QUOTED_IDENTIFIER 的默认数据库设置。默认情况下,连接到 SQL Server 的实例时,ODBC 和 OLE DB 客户端发出连接级别 SET 语句,将 QUOTED_IDENTIFIER 设置为 ON。有关详细信息,请参阅 SET QUOTED_IDENTIFIER (Transact-SQL)

    可通过查看 sys.databases 目录视图中的 is_quoted_identifier_on 列或 DATABASEPROPERTYEX 函数的 IsQuotedIdentifiersEnabled 属性来确定此选项的状态。

  • NUMERIC_ROUNDABORT { ON | OFF }

    • ON
      当表达式中发生精度损失时生成错误。

    • OFF
      精度的降低不会生成错误消息,会根据存储结果的列或变量的精度,将结果舍入。

    创建或更改计算列或索引视图的索引时,NUMERIC_ROUNDABORT 必须设置为 OFF。

    可通过查看 sys.databases 目录视图中的 is_numeric_roundabort_on 列或 DATABASEPROPERTYEX 函数的 IsNumericRoundAbortEnabled 属性来确定此选项的状态。

  • RECURSIVE_TRIGGERS { ON | OFF }

    • ON
      允许递归激发 AFTER 触发器。

    • OFF
      仅不允许直接递归激发 AFTER 触发器。若还要禁用 AFTER 触发器的间接递归触发,请使用 sp_configure,将 nested triggers 服务器选项设置为 0

    注意注意

    当 RECURSIVE_TRIGGERS 设置为 OFF 时,只禁止直接递归触发。若要禁用间接递归触发,还必须将 nested triggers 服务器选项设置为 0。

    可通过查看 sys.databases 目录视图中的 is_recursive_triggers_on 列或 DATABASEPROPERTYEX 函数的 IsRecursiveTriggersEnabled 属性来确定此选项的状态。

WITH <termination>::=

指定当数据库从一种状态转换到另一种状态时,何时回滚未完成的事务。如果终止子句被忽略,则当数据库中存在任何锁时,ALTER DATABASE 语句将无限期等待。只能指定一条终止子句,而且该子句应跟在 SET 子句后面。

注意注意

并非所有数据库选项都使用 WITH <termination> 子句。有关详细信息,请参阅“备注”部分中的“设置选项”下面的表。

  • ROLLBACK AFTER integer [SECONDS] | ROLLBACK IMMEDIATE
    指定是在指定秒数之后回滚还是立即回滚。

  • NO_WAIT
    指定如果请求的数据库状态或选项更改只有等待事务自主提交或回滚才能立即完成,该请求将失败。

注释

设置选项

若要检索数据库选项的当前设置,请使用 sys.databases 目录视图或 DATABASEPROPERTYEX。有关最初创建数据库时所分配的默认值列表,请参阅设置数据库选项

设置数据库选项后,修改将立即生效。

若要更改所有新创建数据库的任意一个数据库选项的默认值,请更改 model 数据库中的相应数据库选项。

并非所有数据库选项都使用 WITH <termination> 子句,或可以结合其他选项指定。下表列出这些选项以及它们的选项和终止状态。

选项类别

可与其他选项一起指定

可使用 WITH <termination> 子句

<db_state_option>

<db_user_access_option>

<db_update_option>

<external_access_option>

<cursor_option>

<auto_option>

<sql_option>

<recovery_option>

<database_mirroring_option>

ALLOW_SNAPSHOT_ISOLATION

READ_COMMITTED_SNAPSHOT

<service_broker_option>

DATE_CORRELATION_OPTIMIZATION

<parameterization_option>

<change_tracking_option>

<db_encryption>

通过设置以下选项之一来清除 SQL Server 实例的计划缓存:

OFFLINE

READ_WRITE

ONLINE

MODIFY FILEGROUP DEFAULT

MODIFY_NAME

MODIFY FILEGROUP READ_WRITE

COLLATE

MODIFY FILEGROUP READ_ONLY

READ_ONLY

 

清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新”。只要每五分钟内缓存得到刷新,此消息就将每五分钟记录一次。 

示例

A. 设置数据库选项

下面的示例设置 AdventureWorks2008R2 示例数据库的恢复模式和数据页面验证选项。

USE master;
GO
ALTER DATABASE AdventureWorks2008R2 
SET RECOVERY FULL, PAGE_VERIFY CHECKSUM;
GO

B. 将数据库设置为 READ_ONLY

将数据库或文件组的状态改为 READ_ONLY 或 READ_WRITE 需要具有数据库的独占访问权。下面的示例将数据库设置为 SINGLE_USER 模式,以获得独占访问权。然后,该示例将 AdventureWorks2008R2 数据库的状态设置为 READ_ONLY,并将对数据库的访问权返回给所有用户。

注意注意

此示例在第一个 ALTER DATABASE 语句中使用终止选项 WITH ROLLBACK IMMEDIATE。所有未完成事务都将被回滚,并将立刻断开 AdventureWorks2008R2 示例数据库的所有其他连接。

USE master;
GO
ALTER DATABASE AdventureWorks2008R2
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE AdventureWorks2008R2
SET READ_ONLY;
GO
ALTER DATABASE AdventureWorks2008R2
SET MULTI_USER;
GO

C. 对数据库启用快照隔离

下面的示例为 AdventureWorks2008R2 数据库启用快照隔离框架选项。

USE AdventureWorks2008R2;
GO
-- Check the state of the snapshot_isolation_framework
-- in the database.
SELECT name, snapshot_isolation_state,
     snapshot_isolation_state_desc AS description
FROM sys.databases
WHERE name = N'AdventureWorks2008R2';
GO
USE master;
GO
ALTER DATABASE AdventureWorks2008R2
    SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- Check again.
SELECT name, snapshot_isolation_state,
     snapshot_isolation_state_desc AS description
FROM sys.databases
WHERE name = N'AdventureWorks2008R2';
GO

结果集显示快照隔离框架已启用。

name            snapshot_isolation_state  description

--------------- ------------------------  -----------

AdventureWorks2008R2  1                         ON

D. 启用、修改和禁用更改跟踪

下面的示例对 AdventureWorks2008R2 数据库启用更改跟踪并将保持期设置为 4 天。

ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = ON
(AUTO_CLEANUP = ON, CHANGE_RETENTION = 2 DAYS);

下面的示例说明如何将保持期更改为 3 天。

ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING (CHANGE_RETENTION = 3 DAYS);

下面的示例说明如何对 AdventureWorks2008R2 数据库禁用更改跟踪。

ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = OFF;