本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第2章,第2.2节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。
锋利的SQL(第2版)在创建数据库之前,必须先确定数据库的名称、所有者、大小以及存储该数据库的文件和文件组。所谓所有者,即是创建数据库的用户。一般情况下,大多数产品对象由数据库所有者拥有。
在创建数据库之前,应注意下列事项。
要创建数据库,必须至少拥有CREATE DATABASE、CREATE ANY DATABASE或ALTER ANY DATABASE权限。创建数据库的用户将成为该数据库的所有者。对于一个SQL Server实例,最多可以创建32767个数据库。数据库名称必须遵循为标识符指定的规则。在创建新数据库时,model数据库中的所有用户定义对象都将复制到所有新创建的数据库中。因此,可以向model数据库中添加任何对象(如表、视图、存储过程和数据类型),以便将这些对象包含到所有新创建的数据库中。
可以使用CREATE DATABASE语句创建数据库,其语法格式如下:
CREATE DATABASE database_name [ ON [ PRIMARY ] [ <filespec> [ ,...n ] [ , <filegroup> [ ,...n ] ] [ LOG ON { <filespec> [ ,...n ] } ] ] [ COLLATE collation_name ] ][;]database_name
要创建的新数据库的名称。
ON
指定以显式定义方式指定存储数据库数据部分的磁盘文件(数据文件)。
PRIMARY
指定列表中的主文件。在项中的第一个文件将成为主文件。如果没有指定PRIMARY,则CREATE DATABASE语句中列出的第一个文件将成为主文件。
LOG ON
指定存储数据库日志的磁盘文件(日志文件)。LOG ON后跟着以逗号分隔的用于定义日志文件的项列表。如果没有指定LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的25%或512 KB,取两者之中的较大者。
COLLATE collation_name
指定数据库的默认排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。如果没有指定排序规则,则将SQL Server实例的默认排序规则分配为数据库的排序规则。排序规则一般用于SELECT查询的ORDER BY子句,详细信息参考5.6节的介绍。
CREATE DATABASE语句中的部分用于控制文件属性,其语法格式如下:
( 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 ]NAME logical_file_name
指定文件的逻辑名称。logical_file_name必须在数据库中唯一,必须符合标识符规则。
FILENAME ' os_file_name '
指定操作系统(物理)文件名称。执行CREATE DATABASE语句前,指定路径必须存在。如果指定了UNC(通用命名约定)路径,则无法设置SIZE、MAXSIZE和FILEGROWTH参数。
SIZE size
指定文件的初始大小。如果没有为主文件指定size,则数据库引擎将使用model数据库中的主文件的大小。如果指定了辅助数据文件或日志文件,但未指定该文件的size,则数据库引擎将以1 MB作为该文件的大小。
可以使用千字节(KB)、兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀,默认为 MB。
MAXSIZE max_size
指定文件可增大到的最大大小,可以使用KB、MB、GB和TB后缀,默认为 MB。
UNLIMITED
指定文件将增长到磁盘已满。在SQL Server中,指定为不限制增长的日志文件的最大大小为2 TB,而数据文件的最大大小为16 TB。
FILEGROWTH growth_increment
指定每次需要新空间时为文件添加的空间量。growth_increment值不能超过MAXSIZE设置值。该值可以使用MB、KB、GB、TB或百分比(%)为单位指定。默认值为MB。growth_increment值为0时表明自动增长被关闭,不允许增加空间。
如果未指定FILEGROWTH,则数据文件的默认值为1 MB,日志文件的默认增长比例为10%,并且最小值为64 KB。
CREATE DATABASE语句中的部分用于控制文件组属性,其语法格式如下:
FILEGROUP filegroup_name [ DEFAULT ] <filespec> [ ,...n ] FILEGROUP filegroup_name文件组的逻辑名称。filegroup_name必须在数据库中唯一,不能是系统提供的名称PRIMARY和PRIMARY_LOG。
DEFAULT
定文件组为数据库中的默认文件组。
1.创建未指定文件的数据库下面的语句将创建名为mydata的数据库,并创建相应的主文件和事务日志文件。因为语句没有项,所以主数据库文件的大小为model数据库主文件的大小。事务日志将设置为下列值中的较大者:512 KB 或主数据文件大小的25%。因为没有指定MAXSIZE,文件可以增大到填满所有可用的磁盘空间为止。
CREATE DATABASE mydata2.创建指定数据和事务日志文件的数据库下面的语句将创建数据库Sales。因为没有使用关键字PRIMARY,第一个文件(Sales_dat)将成为主文件。因为在Sales_dat文件的SIZE参数中没有指定MB或KB,将默认按MB分配。Sales_log文件以MB为单位进行分配,因为SIZE参数中显式声明了MB后缀。
CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'c:\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'c:\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ;3.通过指定多个数据和事务日志文件创建数据库下面的语句将创建数据库Archive,该数据库具有3个100 MB的数据文件和两个100 MB事务日志文件。主文件是列表中的第一个文件,并使用PRIMARY关键字显式指定。事务日志文件在LOG ON关键字后指定。
CREATE DATABASE Archive ON PRIMARY (NAME = Arch1, FILENAME = 'c:\archdat1.mdf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch2, FILENAME = 'c:\archdat2.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch3, FILENAME = 'c:\archdat3.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON (NAME = Archlog1, FILENAME = 'c:\archlog1.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), (NAME = Archlog2, FILENAME = 'c:\archlog2.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) ;4.创建具有文件组的数据库下面的语句将创建数据库Sales,该数据库具有以下文件组。
包含文件Spri1_dat和Spri2_dat的PRIMARY文件组。将这些文件的FILEGROWTH增量指定为15%。名为SalesGroup1的文件组,其中包含文件SGrp1Fi1和SGrp1Fi2。名为SalesGroup2的文件组,其中包含文件SGrp2Fi1和SGrp2Fi2。
CREATE DATABASE Sales ON PRIMARY ( NAME = SPri1_dat, FILENAME = 'c:\SPri1dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), ( NAME = SPri2_dat, FILENAME = 'c:\SPri2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), FILEGROUP SalesGroup1 ( NAME = SGrp1Fi1_dat, FILENAME = 'c:\SG1Fi1dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), ( NAME = SGrp1Fi2_dat, FILENAME = 'c:\SG1Fi2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), FILEGROUP SalesGroup2 ( NAME = SGrp2Fi1_dat, FILENAME = 'c:\SG2Fi1dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), ( NAME = SGrp2Fi2_dat, FILENAME = 'c:\SG2Fi2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'c:\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ;5.创建数据库并指定排序规则名称下面的示例将创建数据库MyOptionsTest,并将排序规则指定为French_CI_AI。
CREATE DATABASE MyOptionsTest COLLATE French_CI_AI; 可以使用下面的语句验证数据库的选项设置: SELECT name, collation_name FROM sys.databases WHERE name = N'MyOptionsTest';在创建数据库后,应当备份master数据库。因为创建数据库将更新master中的系统表。如果master需要还原,则从上次备份master之后新建的所有数据库都将仍然在系统表中有引用,因而可能导致出现错误信息。
可以使用DB_ID函数判断数据库是否已经存在,该函数用于返回数据库的标识号,如果标识号不为空,则表示数据库已经存在。例如,下面的语句返回AdventureWorks数据库的标识号。
SELECT DB_ID(N'AdventureWorks') AS [Database ID]; GO如果未指定数据库名称参数,则返回当前数据库的标识号。例如,下面的语句返回当前数据库master的标识号。
USE master; -- 切换到master数据库 GO SELECT DB_ID() AS [Database ID]; -- 返回当前数据库的标识号 GO实际上,在创建示例数据库时经常用到该函数。例如,下面的语句首先判断要创建的mytest数据库是否已经存在,如果存在则先删除掉,然后再新建数据库。
USE master; GO IF DB_ID (N'mytest') IS NOT NULL DROP DATABASE mytest; GO CREATE DATABASE mytest; GO本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关资源:敏捷开发V1.0.pptx