CREATE DATABASE (Transact-SQL)

更新日期: 2006 年 12 月 12 日

创建一个新数据库及存储该数据库的文件,创建一个数据库快照,或从先前创建的数据库的已分离文件中附加数据库。

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

语法

CREATE DATABASE database_name 
    [ ON 
        [ PRIMARY ] [ <filespec> [ ,...n ] 
        [ , <filegroup> [ ,...n ] ] 
    [ LOG ON { <filespec> [ ,...n ] } ] 
    ] 
    [ COLLATE collation_name ]
    [ WITH <external_access_option> ]
]
[;]

To attach a database
CREATE DATABASE database_name 
    ON <filespec> [ ,...n ] 
    FOR { ATTACH [ WITH <service_broker_option> ]
        | ATTACH_REBUILD_LOG }
[;]

<filespec> ::= 
{
(
    NAME = logical_file_name ,
    FILENAME = 'os_file_name' 
        [ , SIZE = size [ KB | MB | GB | TB ] ] 
        [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] 
        [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]
) [ ,...n ]
}

<filegroup> ::= 
{
FILEGROUP filegroup_name [ DEFAULT ]
    <filespec> [ ,...n ]
}

<external_access_option> ::=
{
    [ DB_CHAINING { ON | OFF } ]
    [ , TRUSTWORTHY { ON | OFF } ]
}
<service_broker_option> ::=
{
    ENABLE_BROKER
  | NEW_BROKER
  | ERROR_BROKER_CONVERSATIONS
}

Create a database snapshot
CREATE DATABASE database_snapshot_name 
    ON 
        (
        NAME = logical_file_name,
        FILENAME = 'os_file_name' 
        ) [ ,...n ] 
    AS SNAPSHOT OF source_database_name
[;]

参数

  • database_name
    新数据库的名称。数据库名称在 SQL Server 的实例中必须唯一,并且必须符合标识符规则。

    除非没有为日志文件指定逻辑名称,否则 database_name 最多可以包含 128 个字符。如果未指定逻辑日志文件名称,则 SQL Server 将通过向 database_name 追加后缀来为日志生成 logical_file_nameos_file_name。这会将 database_name 限制为 123 个字符,从而使生成的逻辑文件名称不超过 128 个字符。

    如果未指定数据文件的名称,则 SQL Server 使用 database_name 作为 logical_file_nameos_file_name

  • ON
    指定显式定义用来存储数据库数据部分的磁盘文件(数据文件)。当后面是以逗号分隔的、用以定义主文件组的数据文件的 <filespec> 项列表时,需要使用 ON。主文件组的文件列表可后跟以逗号分隔的、用以定义用户文件组及其文件的 <filegroup> 项列表(可选)。
  • PRIMARY
    指定关联的 <filespec> 列表定义主文件。在主文件组的 <filespec> 项中指定的第一个文件将成为主文件。一个数据库只能有一个主文件。有关详细信息,请参阅物理数据库文件和文件组

    如果没有指定 PRIMARY,那么 CREATE DATABASE 语句中列出的第一个文件将成为主文件。

  • LOG ON
    指定显式定义用来存储数据库日志的磁盘文件(日志文件)。LOG ON 后跟以逗号分隔的用以定义日志文件的 <filespec> 项列表。如果没有指定 LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的 25% 或 512 KB,取两者之中的较大者。不能对数据库快照指定 LOG ON。
  • COLLATE collation_name
    指定数据库的默认排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。如果没有指定排序规则,则将 SQL Server 实例的默认排序规则分配为数据库的排序规则。不能对数据库快照指定排序规则名称。

    不能使用 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 子句指定排序规则名称。有关如何更改附加数据库的排序规则的信息,请访问此 Microsoft 网站

    有关 Windows 和 SQL 排序规则名称的详细信息,请参阅 COLLATE (Transact-SQL)

  • FOR ATTACH
    指定通过附加一组现有的操作系统文件来创建数据库。必须有一个指定主文件的 <filespec> 项。至于其他 <filespec> 项,只需要指定与第一次创建数据库或上一次附加数据库时路径不同的文件的那些项即可。必须有一个 <filespec> 项指定这些文件。

    FOR ATTACH 具有以下要求:

    • 所有数据文件(MDF 和 NDF)都必须可用。
    • 如果存在多个日志文件,这些文件都必须可用。

    如果一个可读/写数据库具有一个当前不可用的日志文件,并且进行附加操作前在没有使用用户或打开的事务的情况下关闭了该数据库,那么 FOR ATTACH 会自动重新生成日志文件并更新主文件。相比之下,对于只读数据库,由于主文件不能更新,将不能重新生成日志。因此,如果附加一个日志不可用的只读数据库,必须在 FOR ATTACH 子句中提供日志文件或文件。

    ms176061.note(zh-cn,SQL.90).gif注意:
    无法在早期版本的 SQL Server 中附加由较新版本的 SQL Server 创建的数据库。

    在 SQL Server 2005 中,要附加的数据库中包含的所有全文文件也将随之一起附加。若要指定全文目录的新路径,请指定不带全文操作系统文件名的新位置。有关详细信息,请参阅“示例”部分。

    不能对数据库快照指定 FOR ATTACH。

    ms176061.security(zh-cn,SQL.90).gif安全说明:
    建议您不要附加未知或不可信源中的数据库。此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。 在使用未知或不可信源中的数据库之前,请在非生产服务器上的数据库中运行 DBCC CHECKDB,同时检查数据库中的代码(例如,存储过程或其他用户定义代码)。

    有关附加数据库和分离数据库的详细信息,请参阅分离数据库和附加数据库

    ms176061.note(zh-cn,SQL.90).gif注意:
    如果数据库使用 Service Broker,请参阅 <service_broker_option>。

    有关分离或附加数据库时设置的文件权限的信息,请参阅保护数据和日志文件的安全

    当您附加已复制的数据库而不是分离的数据库时,请注意以下事项:

    • 如果将数据库附加到与原始数据库相同的服务器实例和版本,则不需要执行其他步骤。
    • 如果您将数据库附加到同一个服务器实例,但是版本已升级,则必须执行 sp_vupgrade_replication 才能在附加操作完成后升级复制。
    • 如果您将数据库附加到不同的服务器实例,而不考虑版本,则必须执行 sp_removedbreplication 才能在附加操作完成后删除复制。
    ms176061.note(zh-cn,SQL.90).gif注意:
    附加使用 vardecimal 存储格式,但 SQL Server 数据库引擎必须至少升级到 SQL Server 2005 Service Pack 2。无法将压缩的 Service Pack 2 数据库附加到早期版本的 SQL Server。有关 vardecimal 存储格式的详细信息,请参阅将 Decimal 数据存储为可变长度类型
  • FOR ATTACH_REBUILD_LOG
    指定通过附加一组现有的操作系统文件来创建数据库。该选项只限于读/写数据库。如果缺少一个或多个事务日志文件,将重新生成日志文件。必须有一个指定主文件的 <filespec> 项。

    ms176061.note(zh-cn,SQL.90).gif注意:
    如果日志文件可用,数据库引擎将使用这些文件,而不会重新生成日志文件。

    FOR ATTACH_REBUILD_LOG 具有以下要求:

    • 完全关闭数据库。
    • 所有数据文件(MDF 和 NDF)都必须可用。
    ms176061.note(zh-cn,SQL.90).gif重要提示:
    该操作会中断日志备份链。建议在完成该操作后执行完整数据库备份。有关详细信息,请参阅 BACKUP (Transact-SQL)

    通常,FOR ATTACH_REBUILD_LOG 用于将具有大型日志的可读/写数据库复制到另一台服务器,在这台服务器上,数据库副本频繁使用,或仅用于读操作,因而所需的日志空间少于原始数据库。

    不能对数据库快照指定 FOR ATTACH_REBUILD_LOG。

    有关附加数据库和分离数据库的详细信息,请参阅分离数据库和附加数据库

  • <filespec>
    控制文件属性。
  • NAME logical_file_name
    指定文件的逻辑名称。指定 FILENAME 时,需要使用 NAME,除非指定 FOR ATTACH 子句之一。

    • logical_file_name
      引用文件时 SQL Server 中使用的逻辑名称。logical_file_name 必须在数据库中唯一,必须符合标识符规则。名称可以是字符或 Unicode 常量,也可以是常规标识符或分隔标识符。
  • FILENAME 'os_file_name'
    指定操作系统(物理)文件名称。

    • 'os_file_name'
      是创建文件时由操作系统使用的路径和文件名。文件必须驻留在下列一种设备中:安装 SQL Server 的本地服务器、存储区域网络 [SAN] 或基于 iSCSI 的网络。执行 CREATE DATABASE 语句前,指定路径必须存在。有关详细信息,请参阅“备注”部分的“数据库文件和文件组”。

      如果为该文件指定了 UNC 路径,则无法设置 SIZE、MAXSIZE 和 FILEGROWTH 参数。

      如果文件位于原始分区上,则 os_file_name 必须仅指定现有原始分区的驱动器号。每个原始分区上只能创建一个数据文件。

      不应将数据文件放在压缩文件系统中,除非这些文件是只读的辅助文件或数据库是只读的。日志文件一定不要放在压缩文件系统中。有关详细信息,请参阅只读文件组和压缩

  • SIZE size
    指定文件的大小。

    os_file_name 指定为 UNC 路径时,不能指定 SIZE。

    • size
      文件的初始大小。

      如果没有为主文件提供 size,则数据库引擎将使用 model 数据库中的主文件的大小。如果指定了辅助数据文件或日志文件,但未指定该文件的 size ,则数据库引擎将以 1 MB 作为该文件的大小。为主文件指定的大小至少应与 model 数据库的主文件大小相同。

      可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。请指定整数,不要包括小数。size 是整数值。对于大于 2147483647 的值,使用更大的单位。

  • MAXSIZE max_size
    指定文件可增大到的最大大小。将 os_file_name 指定为 UNC 路径时,不能指定 MAXSIZE。

    • max_size
      最大的文件大小。可以使用 KB、MB、GB 和 TB 后缀。默认值为 MB。指定一个整数,不包含小数位。如果不指定 max_size,则文件将增长到磁盘已满。max_size 是整数值。对于大于 2147483647 的值,使用更大的单位。
  • UNLIMITED
    指定文件将增长到磁盘充满。在 SQL Server 2005 中,指定为不限制增长的日志文件的最大大小为 2 TB,而数据文件的最大大小为 16 TB。
  • FILEGROWTH growth_increment
    指定文件的自动增量。文件的 FILEGROWTH 设置不能超过 MAXSIZE 设置。将 os_file_name 指定为 UNC 路径时,不能指定 FILEGROWTH。

    • growth_increment
      每次需要新空间时为文件添加的空间量。

      该值可以 MB、KB、GB、TB 或百分比 (%) 为单位指定。如果未在数量后面指定 MB、KB 或 %,则默认值为 MB。如果指定 %,则增量大小为发生增长时文件大小的指定百分比。指定的大小舍入为最接近的 64 KB 的倍数。

      值为 0 时表明自动增长被设置为关闭,不允许增加空间。

      如果未指定 FILEGROWTH,则数据文件的默认值为 1 MB,日志文件的默认增长比例为 10%,并且最小值为 64 KB。

      ms176061.note(zh-cn,SQL.90).gif注意:
      在 SQL Server 2005 中,数据文件的默认增量已从 10% 改为 1 MB。日志文件的默认值仍然为 10%。
  • <filegroup>
    控制文件组属性。不能对数据库快照指定文件组。
  • FILEGROUP filegroup_name
    文件组的逻辑名称。

    • filegroup_name
      filegroup_name 必须在数据库中唯一,不能是系统提供的名称 PRIMARY 和 PRIMARY_LOG。名称可以是字符或 Unicode 常量,也可以是常规标识符或分隔标识符。名称必须符合标识符规则。
    • DEFAULT
      指定命名文件组为数据库中的默认文件组。
  • <external_access_option>
    控制外部与数据库之间的双向访问。

    • DB_CHAINING { ON | OFF }
      当指定为 ON 时,数据库可以为跨数据库所有权链的源或目标。

      当为 OFF 时,数据库不能参与跨数据库所有权链接。默认值为 OFF。

      ms176061.note(zh-cn,SQL.90).gif重要提示:
      如果 cross db ownership chaining 服务器选项为 0 (OFF),SQL Server 实例将可以识别此设置。如果 cross db ownership chaining 为 1 (ON),则不论此选项为何值,所有用户数据库都可以参与跨数据库所有权链。可以使用 sp_configure 设置此选项。

      若要设置此选项,要求具有 sysadmin 固定服务器角色的成员身份。不能针对下列系统数据库设置 DB_CHAINING 选项:mastermodeltempdb

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

    • TRUSTWORTHY { ON | OFF }
      当指定 ON 时,使用模拟上下文的数据库模块(例如,视图、用户定义函数或存储过程)可以访问数据库以外的资源。

      当为 OFF 时,模拟上下文中的数据库模块不能访问数据库以外的资源。默认值为 OFF。

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

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

      若要设置此选项,要求具有 sysadmin 固定服务器角色的成员身份。

  • <service_broker_option>
    控制数据库上的 Service Broker 选项。

    仅当使用 FOR ATTACH 子句时,才能指定 Service Broker 选项。

    • ENABLE_BROKER
      指定对指定的数据库启用 Service Broker。也就是说,在 sys.databases 目录视图中将 is_broker_enabled 设置为 true,然后开始进行消息传递。
    • NEW_BROKER
      sys.databases 和还原数据库中都创建一个新的 service_broker_guid 值,并通过清除结束所有会话端点。Broker 已启用,但未向远程会话端点发送消息。
    • ERROR_BROKER_CONVERSATIONS
      结束所有会话,并产生一个错误指出数据库已附加或还原。Broker 一直处于禁用状态直到此操作完成,然后再将其启用。
  • database_snapshot_name
    新数据库快照的名称。数据库快照名称必须在 SQL Server 的实例中唯一,并且必须符合标识符规则。database_snapshot_name 最多可以包含 128 个字符。
  • ON ( NAME =logical_file_name, FILENAME ='os_file_name') [ ,... n ]
    若要创建数据库快照,请在源数据库中指定文件列表。若要使快照工作,必须分别指定所有数据文件。但是,日志文件不允许用于数据库快照。

    有关 NAME 和 FILENAME 以及其值的说明,请参阅等价的 <filespec> 值的说明。

    ms176061.note(zh-cn,SQL.90).gif注意:
    创建数据库快照时,不允许使用其他 <filespec> 选项和关键字 PRIMARY。
  • AS SNAPSHOT OF source_database_name
    指定要创建的数据库为 source_database_name 指定的源数据库的数据库快照。快照和源数据库必须位于同一实例中。

    有关详细信息,请参阅“备注”部分的“数据库快照”。

备注

创建、修改或删除用户数据库后,应备份 master 数据库

CREATE DATABASE 语句必须以自动提交模式(默认事务管理模式)运行,不允许在显式或隐式事务中使用。有关详细信息,请参阅自动提交事务

使用一条 CREATE DATABASE 语句即可创建数据库以及存储该数据库的文件。SQL Server 通过使用以下步骤实现 CREATE DATABASE 语句:

  1. SQL Server 2005 数据库引擎使用 model 数据库的副本初始化该数据库及其元数据。
  2. 为数据库分配 Service Broker GUID。
  3. 然后,数据库引擎使用空页填充数据库的剩余部分,包含记录数据库中空间使用情况的内部数据页除外。有关详细信息,请参阅数据库文件初始化

在一个 SQL Server 的实例中最多可以指定 32,767 个数据库。

每个数据库都有一个所有者,它可以在数据库中执行特殊操作。所有者是创建数据库的用户。可以使用 sp_changedbowner (Transact-SQL) 更改数据库所有者。

数据库文件和文件组

每个数据库至少有两个文件(一个主文件和一个事务日志文件)和一个文件组。可以为每个数据库指定最多 32,767 个文件和 32,767 个文件组。有关详细信息,请参阅物理数据库文件和文件组

在创建数据库时,请根据数据库中预期的最大数据量,创建尽可能大的数据文件。有关详细信息,请参阅使用文件和文件组管理数据库增长

建议使用存储区域网络 (SAN)、基于 iSCSI 的网络或本地附加的磁盘来存储 SQL Server 数据库文件,因为该配置使 SQL Server 的性能和可靠性得到了优化。默认情况下,不对 SQL Server 启用使用网络数据库文件(存储在网络服务器或网络附加的存储器上)。但是,可以使用跟踪标志 1807 创建具有基于网络的数据库文件的数据库。有关此跟踪标志以及重要的性能和维护注意事项的信息,请参阅此 Microsoft 网站

数据库快照

可以使用 CREATE DATABASE 语句创建现有数据库(“源数据库”)的只读静态视图(“数据库快照”)。当创建快照时,源数据库已存在,所以数据库快照在事务上与源数据库一致,源数据库可以具有多个快照。

ms176061.note(zh-cn,SQL.90).gif注意:
创建数据库快照时,CREATE DATABASE 语句不能引用日志文件、离线文件、还原文件和不存在的文件。

如果创建数据库快照失败,快照便成为可疑快照,必须将其删除。有关详细信息,请参阅 DROP DATABASE (Transact-SQL)

每个快照都将一直存在,直到使用 DROP DATABASE 将其删除为止。

有关详细信息,请参阅数据库快照

数据库选项

创建数据库时,总会自动设置几个数据库选项。有关这些选项及其默认设置的列表,请参阅设置数据库选项。可以使用 ALTER DATABASE 语句修改这些选项。

model 数据库和创建新数据库

model 数据库中的所有用户定义对象都将复制到所有新创建的数据库中。可以向 model 数据库中添加任何对象(例如表、视图、存储过程、数据类型等),以将这些对象包括到所有新建数据库中。

当指定 CREATE DATABASE database_name 语句而不带其他大小参数时,主数据文件将与 model 数据库中的主文件具有相同的大小。

除非指定了 FOR ATTACH,否则每个新数据库都从 model 数据库继承数据库选项设置。例如,在 model 和创建的任何新数据库中,数据库选项 auto shrink 都设置为 true。如果更改了 model 数据库中的选项,则这些新选项设置也将用于您所创建的所有新数据库中。在 model 数据库中的更改操作不会影响现有数据库。如果在 CREATE DATABASE 语句中指定了 FOR ATTACH,则新数据库将继承原始数据库的数据库选项设置。

查看数据库信息

可以使用目录视图、系统函数和系统存储过程返回有关数据库、文件和文件组的信息。有关详细信息,请参阅查看数据库元数据

权限

要求具有 CREATE DATABASE、CREATE ANY DATABASE 或 ALTER ANY DATABASE 的权限。

为了控制对运行 SQL Server 实例的计算机上的磁盘使用,通常只有少数登录帐户才有创建数据库的权限。

对数据文件和日志文件的权限

在 SQL Server 2005 中,对各个数据库的数据和日志文件设置了某些权限。每当对数据库执行下列操作时,便会设置下列权限:

创建

修改以添加新文件

附加

备份

分离

还原

如果这些文件位于具有打开权限的目录中,那么以上权限可以防止文件被意外篡改。有关详细信息,请参阅保护数据和日志文件的安全

ms176061.note(zh-cn,SQL.90).gif注意:
Microsoft SQL Server 2005 Express Edition 不设置数据文件和日志文件权限。

示例

A. 创建未指定文件的数据库

以下示例创建名为 mytest 的数据库,并创建相应的主文件和事务日志文件。因为语句没有 <filespec> 项,所以主数据库文件的大小为 model 数据库主文件的大小。事务日志将设置为下列值中的较大者:512 KB 或主数据文件大小的 25%。因为没有指定 MAXSIZE,文件可以增大到填满所有可用的磁盘空间为止。

USE master;
GO
IF DB_ID (N'mytest') IS NOT NULL
DROP DATABASE mytest;
GO
CREATE DATABASE mytest;
GO
-- Verify the database files and sizes
SELECT name, size, size*1.0/128 AS [Size in MBs] 
FROM sys.master_files
WHERE name = N'mytest';
GO

B. 创建指定数据和事务日志文件的数据库

下面的示例将创建数据库 Sales。因为没有使用关键字 PRIMARY,第一个文件 (Sales_dat) 将成为主文件。因为在 Sales_dat 文件的 SIZE 参数中没有指定 MB 或 KB,将使用 MB 并按 MB 分配。Sales_log 文件以 MB 为单位进行分配,因为 SIZE 参数中显式声明了 MB 后缀。

USE master;
GO
IF DB_ID (N'Sales') IS NOT NULL
DROP DATABASE Sales;
GO
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);

-- execute the CREATE DATABASE statement 
EXECUTE ('CREATE DATABASE Sales
ON 
( NAME = Sales_dat,
    FILENAME = '''+ @data_path + 'saledat.mdf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
    FILENAME = '''+ @data_path + 'salelog.ldf'',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB )'
);
GO

C. 通过指定多个数据和事务日志文件创建数据库

以下示例创建数据库 Archive,该数据库具有三个 100 MB 数据文件和两个 100 MB 事务日志文件。主文件是列表中的第一个文件,并使用 PRIMARY 关键字显式指定。事务日志文件在 LOG ON 关键字后指定。请注意用于 FILENAME 选项中各文件的扩展名:.mdf 用于主数据文件,.ndf 用于辅助数据文件,.ldf 用于事务日志文件。

USE master;
GO
IF DB_ID (N'Archive') IS NOT NULL
DROP DATABASE Archive;
GO
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);

-- execute the CREATE DATABASE statement 
EXECUTE ('CREATE DATABASE Archive 
ON
PRIMARY  
    (NAME = Arch1,
    FILENAME = '''+ @data_path + 'archdat1.mdf'',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20),
    ( NAME = Arch2,
    FILENAME = '''+ @data_path + 'archdat2.ndf'',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20),
    ( NAME = Arch3,
    FILENAME = '''+ @data_path + 'archdat3.ndf'',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20)
LOG ON 
   (NAME = Archlog1,
    FILENAME = '''+ @data_path + 'archlog1.ldf'',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20),
   (NAME = Archlog2,
    FILENAME = '''+ @data_path + 'archlog2.ldf'',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20)'
);
GO

D. 创建具有文件组的数据库

以下示例创建数据库 Sales,该数据库具有以下文件组:

  • 包含文件 Spri1_datSpri2_dat 的主文件组。将这些文件的 FILEGROWTH 增量指定为 15%
  • 名为 SalesGroup1 的文件组,其中包含文件 SGrp1Fi1SGrp1Fi2
  • 名为 SalesGroup2 的文件组,其中包含文件 SGrp2Fi1SGrp2Fi2
USE master;
GO
IF DB_ID (N'Sales') IS NOT NULL
DROP DATABASE Sales;
GO
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);

-- execute the CREATE DATABASE statement 
EXECUTE ('CREATE DATABASE  Sales
ON PRIMARY
( NAME = SPri1_dat,
    FILENAME = '''+ @data_path + 'SPri1dat.mdf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 15% ),
( NAME = SPri2_dat,
    FILENAME = '''+ @data_path + 'SPri2dt.ndf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 15% ),
FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
    FILENAME = '''+ @data_path + 'SG1Fi1dt.ndf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
    FILENAME = '''+ @data_path + 'SG1Fi2dt.ndf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
    FILENAME = '''+ @data_path + 'SG2Fi1dt.ndf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
    FILENAME = '''+ @data_path + 'SG2Fi2dt.ndf'',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
    FILENAME = '''+ @data_path + 'salelog.ldf'',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB )'
);
GO

E. 附加数据库

以下示例分离在示例 C 中创建的数据库 Archive,然后使用 FOR ATTACH 子句附加该数据库。Archive 定义为具有多个数据和日志文件。但是,由于文件的位置自创建后没有发生更改,所以只需在 FOR ATTACH 子句中指定主文件。在 SQL Server 2005 中,要附加的数据库中包含的所有全文文件也将随之一起附加。

USE master;
GO
sp_detach_db Archive;
GO
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);
-- Execute CREATE DATABASE FOR ATTACH statement
EXEC ('CREATE DATABASE Archive
      ON (FILENAME = '''+ @data_path + 'archdat1.mdf'')
      FOR ATTACH');
GO

F. 创建数据库快照

以下示例创建数据库快照 sales_snapshot0600。由于数据库快照是只读的,所以不能指定日志文件。为了符合语法要求,指定了源数据库中的每个文件,但没有指定文件组。

该示例的源数据库是在示例 D 中创建的 Sales 数据库。

USE master;
GO
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1);
-- execute the CREATE DATABASE statement 
EXECUTE (
'CREATE DATABASE sales_snapshot0600 ON
    ( NAME = SPri1_dat, FILENAME = '''+ @data_path + 'SPri1dat_0600.ss''),
    ( NAME = SPri2_dat, FILENAME = '''+ @data_path + 'SPri2dt_0600.ss''),
    ( NAME = SGrp1Fi1_dat, FILENAME = '''+ @data_path + 'SG1Fi1dt_0600.ss''),
    ( NAME = SGrp1Fi2_dat, FILENAME = '''+ @data_path + 'SG1Fi2dt_0600.ss''),
    ( NAME = SGrp2Fi1_dat, FILENAME = '''+ @data_path + 'SG2Fi1dt_0600.ss''),
    ( NAME = SGrp2Fi2_dat, FILENAME = '''+ @data_path + 'SG2Fi2dt_0600.ss'')
AS SNAPSHOT OF Sales');
GO

G. 创建数据库并指定排序规则名称和选项

下面的示例将创建数据库 MyOptionsTest。指定了排序规则名称,并将 TRUSTYWORTHYDB_CHAINING 选项设置为 ON

USE master;
GO
IF DB_ID (N'MyOptionsTest') IS NOT NULL
DROP DATABASE MyOptionsTest;
GO
CREATE DATABASE MyOptionsTest
COLLATE French_CI_AI
WITH TRUSTWORTHY ON, DB_CHAINING ON;
GO
--Verifying collation and option settings.
SELECT name, collation_name, is_trustworthy_on, is_db_chaining_on
FROM sys.databases
WHERE name = N'MyOptionsTest';
GO

H. 附加已移动的全文目录

以下示例同时附加全文目录 AdvWksFtCat 以及 AdventureWorks 数据和日志文件。在该示例中,将全文目录从其默认位置移动到新位置 c:\myFTCatalogs。数据和日志文件保留在其默认位置。

USE master;
GO
--Detach the AdventureWorks database
sp_detach_db AdventureWorks;
GO
-- Physically move the full text catalog to the new location.
--Attach the AdventureWorks database and specify the new location of the full-text catalog.
CREATE DATABASE AdventureWorks ON 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf'), 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_log.ldf'),
    (FILENAME = 'c:\myFTCatalogs\AdvWksFtCat')
FOR ATTACH;
GO

请参阅

参考

ALTER DATABASE (Transact-SQL)
DROP DATABASE (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_changedbowner (Transact-SQL)
sp_detach_db (Transact-SQL)
sp_removedbreplication (Transact-SQL)

其他资源

分离数据库和附加数据库
了解数据库
数据库快照
移动数据库文件

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

新增内容:
  • 在 FOR ATTACH 说明中添加了有关附加已为 vardecimal 存储格式而启用的 SQL Server 2005 Service Pack 2 数据库的注释。
  • 向 FOR ATTACH 说明中添加注释,声明无法在早期版本的 SQL Server 中附加由较新版本的 SQL Server 创建的数据库。

2005 年 12 月 5 日

新增内容:
  • 在 FOR ATTACH 的定义中添加了安全说明。
更改的内容:
  • 更正了系统数据库中 TRUSTWORTHY 选项的相关信息。