2.3 命令方式创建数据库
除了可以通过“SQL Server Management Studio”的图形界面方式创建数据库外,还可以使用T-SQL命令(称为命令方式)来创建数据库。与界面方式创建数据库相比,命令方式更为常用,使用也更为灵活。
2.3.1 创建数据库:CREATE DATABASE
命令方式创建数据库使用CREATE DATABASE命令,创建前要确保用户具有创建数据库的权限。
CREATE DATABASE命令主要格式如下:
CREATE DATABASE数据库名 [ ON [ PRIMARY ] [ <数据文件选项> ... [ , <数据文件组选项> ... ] [ LOG ON { <日志文件选项> ... } ] ] [ COLLATE排序名] …… ]
1. 文件选项
其中,<文件选项>格式为:
{ ( NAME =逻辑文件名, FILENAME = { '操作系统文件名' | '存储路径' } [ , SIZE =文件初始容量] [ , MAXSIZE = { 文件最大容量 | UNLIMITED } ] [ , FILEGROWTH = 文件增量[容量 | % ] ] ) }
说明
(1)逻辑文件名:数据库使用的名字。
(2)操作系统文件名:操作系统在创建物理文件时使用的路径和文件名。
(3)文件初始容量:对于主文件,若不指出大小,则默认为model数据库主文件的大小。对于辅助数据文件,自动设置为3 MB。
(4)文件最大容量:指定文件的最大大小。UNLIMITED关键字表示文件大小不受限制,但实际上受磁盘可用空间的限制。如果不指定MAXSIZE选项,则文件将增长到磁盘空间满。
(5)文件增量:有百分比和容量值两种格式,前者如10%,即每次在原来空间大小的基础上增长10%;后者如5 MB,即每次增长5 MB,而不管原来空间大小是多少。
注意
没有说明的部分参考联机文档,后面不再特别说明。
2. 文件组选项
<文件组选项>格式为:
{ FILEGROUP文件组名[ DEFAULT ] <文件选项> …… }
(1)DEFAULT关键字:指定命名文件组为数据库中的默认文件组。
(2)<文件选项>:用于指定属于该文件组的文件的属性,其格式描述和数据文件的属性描述相同。
另外,COLLATE排序名:指定数据库的默认排序规则。“排序名”既可以是Windows排序规则名称,也可以是数据库排序规则名称(默认)。
【例2.4】创建一个名为test1的数据库,其初始大小为5 MB,最大为50 MB,允许数据库自动增长,增长方式是按10%比例增长。日志文件初始为2 MB,最大可增长到5 MB,按1 MB增长。数据文件和日志文件的存放位置为“'E:\Data”。假设SQL Server服务已启动,并以系统管理员身份登录计算机。
在“SQL Server Management Studio”窗口中单击“新建查询”按钮新建一个查询窗口,在“查询分析器”窗口中输入如下T-SQL语句:
CREATE DATABASE test1 ON ( NAME= "test1_data", FILENAME="E:\Data\test1.mdf", SIZE=5MB, MAXSIZE=50MB, FILEGROWTH=10% ) LOG ON ( NAME="test1_log", FILENAME="E:\Data\test1.ldf", SIZE=2MB, MAXSIZE=5MB, FILEGROWTH=1MB );
输入完毕后,单击SSMS面板上的“!执行”按钮,消息窗口将显示命令执行情况。如图2.12所示。
图2.12 在查询分析器中执行创建数据库命令
注意
在FILENAME中使用的文件扩展名,.mdf用于主数据文件,.ndf用于辅数据文件,.ldf用于日志文件。FILENAME选项中指定的数据和日志文件的目录“E:\Data\”必须存在,否则将产生错误,即创建数据库失败。
如果“消息框”中显示错误信息,需要查找原因,然后更正后执行;也可通过调试查找原因。
当命令成功执行后,在“对象资源管理器”中展开“数据库”,可以看到新建的数据库“test1”就显示于其中。如果没有发现“test1”,则选择“数据库”,单击鼠标右键,在弹出的快捷菜单中选择“刷新”菜单项即可。
通过“数据库属性”对话框,可以看到新建立test1数据库的各项属性完全符合预定要求。
【例2.5】创建一个名为test2的数据库,它有两个数据文件,其中主数据文件为20 MB,最大不限,按10%增长。1个辅数据文件为20 MB,最大不限,按10%增长;有1个日志文件,为50 MB,最大为100 MB,按10 MB增长。
在“查询分析器”中输入如下T-SQL语句并执行:
CREATE DATABASE test2 ON PRIMARY ( NAME = 'test2_data1', FILENAME = 'E:\Data\test2_data1.mdf', SIZE = 20 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) , ( NAME = 'test2_data2', FILENAME = 'E:\Data\test2_data2.ndf', SIZE = 20 MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) LOG ON ( NAME = 'test2_log1', FILENAME = 'E:\Data\test2_log1.ldf', SIZE = 50 MB, MAXSIZE = 100 MB, FILEGROWTH = 10 MB );
【例2.6】创建一个具有2个文件组的数据库test3。要求:
(1)主文件组包括文件test3_dat1,文件初始大小为20 MB,最大为60 MB,按5 MB增长。
(2)有1个文件组名为test3Group1,包括文件test3_dat2,文件初始大小为10 MB,最大为30 MB,按10%增长。
CREATE DATABASE test3 ON PRIMARY ( NAME ='test3_dat1', FILENAME = 'E:\Data\test3_dat1.mdf', SIZE = 20MB, MAXSIZE = 60MB, FILEGROWTH = 5MB ), FILEGROUP test3Group1 ( NAME ='test3_dat2', FILENAME = 'E:\Data\test3_dat2.ndf', SIZE = 10MB, MAXSIZE = 30MB, FILEGROWTH = 10% );
2.3.2 修改数据库:ALTER DATABASE
使用ALTER DATABASE命令可对数据库进行修改,语法格式如下:
ALTER DATABASE数据库名 { ADD FILE <文件选项>... [TO FILEGROUP文件组名] / *在文件组中增加数据文件* / | ADD LOG FILE <文件选项>... / *增加日志文件* / | REMOVE FILE逻辑文件名 / *删除数据文件* / | ADD FILEGROUP文件组名[……] / *增加文件组* / | REMOVE FILEGROUP文件组名 / *删除文件组* / | MODIFY FILE <文件选项> / *更改文件属性* / | MODIFY NAME = 新数据库名 / *数据库更名* / | MODIFY FILEGROUP文件组名 { <文件组可更新选项> | DEFAULT | NAME = 新文件组名 } / *更改文件组属性* / | SET <属性选项> ... [ WITH <终止> ] / *设置数据库属性* / | COLLATE排序名 / *指定数据库排序规则* / }
1. 命令主体
ALTER DATABASE命令主体结构说明如下。
(1)ADD FILE子句:向数据库添加数据文件,<文件属性>给出文件的属性,其构成参见CREATE DATABASE语法说明。关键字TO FILEGROUP指出了添加的数据文件所在的文件组名,若缺省,则为主文件组。
(2)ADD LOG FILE子句:向数据库添加日志文件,<文件属性>给出日志文件的属性。
(3)REMOVE FILE子句:从数据库中删除数据文件,被删除的数据文件由其中的参数“逻辑文件名”给出。当删除一个数据文件时,逻辑文件与物理文件全部被删除。
(4)ADD FILEGROUP子句:向数据库中添加文件组,被添加的文件组名由参数“文件组名”给出。
(5)REMOVE FILEGROUP子句:删除文件组,被删除的文件组名由参数“文件组名”给出。
(6)MODIFY FILE子句:修改数据文件的属性,被修改文件的逻辑名由<文件属性>的NAME选项给出,可以修改的文件属性包括FILENAME、SIZE、MAXSIZE和FILEGROWTH,但要注意,一次只能修改其中的一个属性。修改文件大小时,修改后的大小不能小于当前文件的大小。
(7)MODIFY NAME子句:更改数据库名,新的数据库名由参数“新数据库名”给出。
(8)MODIFY FILEGROUP子句:用于修改文件组的属性。“文件组名”为要修改的文件组名称。其中:
<文件组可更新选项>设置文件组读写权限;
DEFAULT选项表示将默认数据库文件组改为指定文件组;
NAME选项用于将文件组名称改为新文件组名。
(9)SET子句:用于设置数据库的属性,<属性选项>中指定了要修改的属性。例如,设为READ_ONLY时用户可以从数据库读取数据,但不能修改数据库。其他属性请参考SQL Server联机丛书。
2. 文件组可更新选项
<文件组可更新选项>定义为:
{ { READONLY | READWRITE } { READ_ONLY | READ_WRITE } }
(1)READONLY和READ_ONLY选项:用于将文件组设为只读。
(2)READWRITE和READ_WRITE选项:将文件组设为读/写模式。
一般使用READ_ONLY和READ_WRITE,另外两个选项在以后的版本中将不再使用。
【例2.7】假设已经创建了数据库test1,它只有一个主数据文件,其逻辑文件名为test1_data,大小为5 MB,最大为50 MB,增长方式为按10%增长。
要求:修改数据库test1现有数据文件test1_data的属性,将主数据文件的最大容量改为100 MB,增长方式改为按每次5 MB增长。
在“查询分析器”窗口中输入如下T-SQL语句:
ALTER DATABASE test1 MODIFY FILE ( NAME ='test1_data', MAXSIZE =100 MB, / *将主数据文件的最大改为100 MB* / FILEGROWTH = 5 MB / *将主数据文件的增长方式改为按5 MB增长* / ) GO
单击“执行”按钮执行输入的T_SQL语句,右键单击“对象资源管理器”中的“数据库”,选择“刷新”菜单项,之后右键单击数据库test1的图标,选择“属性”菜单项,在“文件”页上查看修改后的数据文件。
注意
GO命令不是T-SQL语句,但它是SSMS代码编辑器可识别的命令。SQL Server实用工具将GO命令解释为应该向SQL Server实例发送当前批T-SQL语句的信号。当前批语句由上一个GO命令后输入的所有语句组成,如果是第一条GO命令,则由会话或脚本开始后输入的所有语句组成。
GO命令和T-SQL语句不能在同一行中,否则运行时会发生错误。
【例2.8】先为数据库test1增加数据文件test1bak,然后删除该数据文件。
ALTER DATABASE test1 ADD FILE ( NAME = 'test1bak', FILENAME = 'E:\Data\test1bak.ndf', SIZE = 10 MB, MAXSIZE = 50 MB, FILEGROWTH = 5% )
通过查看“数据库属性”窗口中的文件属性来观察数据库test1是否增加数据文件test1bak。
删除数据文件test1bak的命令如下:
ALTER DATABASE test1 REMOVE FILE test1bak GO
【例2.9】为数据库test1添加文件组fgroup,并为此文件组添加两个大小均为10 MB的数据文件。
在“查询分析器”中输入如下T-SQL语句并执行:
ALTER DATABASE test1 ADD FILEGROUP fgroup GO ALTER DATABASE test1 ADD FILE ( NAME = 'test1_data2', FILENAME = 'E:\Data\test1_data2.ndf', SIZE = 10 MB ), ( NAME = 'test1_data3', FILENAME = 'E:\Data\test1_data3.ndf', SIZE = 10 MB ) TO FILEGROUP fgroup GO
【例2.10】从数据库中删除文件组,将添加到test1数据库中的文件组fgroup删除。
注意
被删除的文件组中的数据文件必须先删除,且不能删除主文件组。
在“查询分析器”中输入如下T-SQL语句并执行:
ALTER DATABASE test1 REMOVE FILE test1_ data2 GO ALTER DATABASE test1 REMOVE FILE test1_ data3 GO ALTER DATABASE test1 REMOVE FILEGROUP fgroup GO
【例2.11】为数据库test1添加一个日志文件。
在“查询分析器”中输入如下T-SQL语句并执行:
ALTER DATABASE test1 ADD LOG FILE ( NAME = 'test1_log2', FILENAME = 'E:\Data\test1_log2.ldf', SIZE = 5 MB, MAXSIZE =10 MB, FILEGROWTH = 1 MB ) GO
【例2.12】从数据库TEST1中删除一个日志文件,将日志文件TEST1_LOG2删除。
将数据库test1的名改为just_test。进行此操作时必须保证该数据库此时没有被其他任何用户使用。
在“查询分析器”中输入如下T-SQL语句并执行:
ALTER DATABASE TEST1 REMOVE FILE TEST1_LOG2 GO ALTER DATABASE test3 MODIFY NAME = just_test3 GO
注意
不能删除主日志文件。
2.3.3 删除数据库:DROP DATABASE
删除数据库使用DROP DATABASE命令。
语法格式:
DROP DATABASE数据库名......
其中,“数据库名”是要删除的数据库名。例如,要删除数据库test2,使用命令:
DROP DATABASE test2 GO
注意
使用DROP DATABASE语句不会出现确认信息,所以要小心使用。另外,不能删除系统数据库,否则将导致服务器无法使用。
2.3.4 数据库快照:AS SNAPSHOT
数据库快照就是指数据库在某一指定时刻的情况,数据库快照提供了源数据库在创建快照时刻的只读、静态视图。虽然数据库在不断变化,但数据库快照一旦创建就不会改变了。多个快照可以位于一个源数据库中,并且可以作为数据库始终驻留在同一服务器实例上。创建快照时,每个数据库快照在事务上与源数据库一致。在被数据库所有者显式删除之前,快照始终存在。
快照可用于报表。另外,如果源数据库出现用户错误,还可将源数据库恢复到创建快照时的状态。丢失的数据仅限于创建快照后数据库更新的数据。
创建数据库快照也使用CREATE DATABASE命令。语法格式如下:
CREATE DATABASE数据库快照名 ON( NAME = 逻辑文件名, FILENAME = '操作系统文件名' ) [, ... ] AS SNAPSHOT OF源数据库名
说明
(1)数据库快照名:数据库快照的名称,这个名称在SQL Server实例中必须唯一且符合标识符规则。
(2)ON子句:若要创建数据库快照,要在源数据库中指定文件列表。若要使快照工作,则必须分别指定所有数据文件。其中,NAME是数据库“行数据”文件对应的逻辑名,FILENAME是物理文件名(包含路径)。日志文件不允许用于数据库快照。
(3)AS SNAPSHOT OF子句:指定要创建的快照为“源数据库名”指定的数据库的快照。数据库快照必须与源数据库处于同一实例中。
注意
创建了数据库快照之后,快照的源数据库就会存在一些限制。如不能对数据库删除、分离或还原;源数据库性能会受到影响;不能从源数据库或其他快照上删除文件;源数据库必须处于在线状态。
【例2.13】创建test1数据库的快照test1_s1。
CREATE DATABASE test1_s1 ON ( NAME=test1_data, FILENAME ='E:\Data\test1_s1.mdf' ) AS SNAPSHOT OF test1 GO
命令执行成功之后,在“对象资源管理器”窗口中刷新“数据库”菜单栏,在“数据库”中展开“数据库快照”,就可以看见刚刚创建的数据库快照test1_s1了。
删除数据库快照的方法和删除数据库的方法完全相同,可以使用界面方式删除,也可以使用命令方式删除,例如:
DROP DATABASE test1_s1;