SQL Server 2016 数据库教程(第4版)
上QQ阅读APP看书,第一时间看更新

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;