CREATE DATABASE建库语句详解(2)--附加数据库

如果您没看过第一篇,请看这里

 

上一篇并没有把CREATE DATABASE的全部功能说完,还差附加数据库和数据库快照,这篇写一下附加数据库。因为附加和分离是一对,而且分离的命令比较简单,所以也一并说一下。

 

先简单说一下附加和分离是啥意思 :前一篇说过,MSSQL的数据都存放在文件中,所以有数据库文件就可以根据现有的数据库文件生成数据库,由现有的数据库文件(比如买来的毕业设计里的.mdf文件和.ldf文件)建立数据库的操作就叫附加数据库。反之,将一个现有数据库从当前实例中去掉而不删除其数据文件的操作就是分离了,去掉而且删除的操作当然是叫删除。

 

要附加数据库,当然先要有数据库文件,这个上一篇文章中的语句就可以建出来,我复制一部分,用来作为本文附加数据库的素材。

首先在D盘建立DATABASE文件夹(只有C盘的童鞋请改成C盘。。。。),然后运行下边的语句:

IF DB_ID('TEST') IS NOT NULL DROP DATABASE TEST
GO
CREATE DATABASE TEST
ON PRIMARY (
NAME=TEST_DAT_MAIN1
,FILENAME='D:/DATABASE/TEST_DAT_MAIN1.MDF'
,SIZE=3MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
),(
NAME=TEST_DAT_MAIN2
,FILENAME='D:/DATABASE/TEST_DAT_MAIN2.MDF'
,SIZE=3MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
,FILEGROUP TEST_DAT_SUB1 DEFAULT (
NAME=TEST_DAT_SUB1
,FILENAME='D:/DATABASE/TEST_DAT_SUB1.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
),(
NAME=TEST_DAT_SUB2
,FILENAME='D:/DATABASE/TEST_DAT_SUB2.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
,FILEGROUP TEST_DAT_SUB2 (
NAME=TEST_DAT_SUB3
,FILENAME='D:/DATABASE/TEST_DAT_SUB3.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
LOG ON (
NAME=TEST_LOG1
,FILENAME='D:/DATABASE/TEST_LOG1.LDF'
,SIZE=10MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=10MB
),(
NAME=TEST_LOG2
,FILENAME='D:/DATABASE/TEST_LOG2.LDF'
,SIZE=10MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=10MB
)
COLLATE CHINESE_PRC_CI_AS
WITH
DB_CHAINING OFF
,TRUSTWORTHY OFF

 

等上几秒就建好了。这时检查刚才新建的文件夹,已经多出了5个.mdf和2个.ldf文件。

 

然后为了附加我们先要分离,运行下面的语句:

 

EXEC sp_detach_db 'TEST',TRUE,TRUE

 

sp_detach_db这是个系统提供的存储过程,用来分离数据库,当然想成功分离有很多条件,幸运的是刚创建的数据库一定符合所有条件,所以我们先不说这些,拿来用完了再研究。

'TEST'   这个不用多说了,要分离的数据库名称

后面两个TRUE,第一个是否UPDATE STATISTICS,也就是更新数据库统计信息,统计信息就是表和索引在数据库中存储的档案,包括行数啦占用空间啦什么的,没接触过的童鞋可以先不管,我们这里用不到这个东东。第二个TRUE是指定是否保留全文索引,这里也不管,而且听说在后续版本中会不支持这个功能。

因为后面两个选项我们都用不到,所以也可以不写,只写要分离的数据库名称就好了

EXEC sp_detach_db 'TEST'

 

运行完毕后再刷新一下数据库就可以看到TEST库已经消失了,但文件夹里数据库文件还在。

现在我们假设我们把数据库文件COPY了出来放到了另一个装有SQLSERVER的机器上,正好也放在了同一目录下。要附加刚才的数据库,执行下面的语句就就可以了


CREATE DATABASE TEST
ON PRIMARY (
NAME=TEST_DAT_MAIN1
,FILENAME='D:/DATABASE/TEST_DAT_MAIN1.MDF'
,SIZE=3MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
),(
NAME=TEST_DAT_MAIN2
,FILENAME='D:/DATABASE/TEST_DAT_MAIN2.MDF'
,SIZE=3MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
,FILEGROUP TEST_DAT_SUB1 DEFAULT (
NAME=TEST_DAT_SUB1
,FILENAME='D:/DATABASE/TEST_DAT_SUB1.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
),(
NAME=TEST_DAT_SUB2
,FILENAME='D:/DATABASE/TEST_DAT_SUB2.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
,FILEGROUP TEST_DAT_SUB2 (
NAME=TEST_DAT_SUB3
,FILENAME='D:/DATABASE/TEST_DAT_SUB3.MDF'
,SIZE=2MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=5MB
)
LOG ON (
NAME=TEST_LOG1
,FILENAME='D:/DATABASE/TEST_LOG1.LDF'
,SIZE=10MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=10MB
),(
NAME=TEST_LOG2
,FILENAME='D:/DATABASE/TEST_LOG2.LDF'
,SIZE=10MB
,MAXSIZE=UNLIMITED
,FILEGROWTH=10MB
)
FOR ATTACH

 

除了最后一句,都和正常的建库语句一样,而两者的主要区别这么几个地方:

附加数据库时不能指定排序规则,因为数据库是已经创建好的;

不能指定外部与数据库之间的双向访问,原因同上;

最后必须有一句FOR ATTACH或者FOR ATTACH_REBUILD_LOG两者的区别在于后者必须对应读/写数据库,因为如果缺少日志文件,后者会重新生成日志文件。

 

关于FOR ATTACH,后面还可以跟一个WITH语句,指定对数据库的Service Broker的处理方式(如果数据库使用了的话),不懂也没关系,我也没打算写这个,知道有这么一个选项存在就行。

 

附加数据库的流程就是这样了,语法基本和正常创建一样,就是后面变了一下。读过第一篇的读者应该可以轻松读懂语句,那就再读一遍或者改成自己的版本再熟悉一下吧。

 

最后把附加数据库的注意事项列一下,作为知识的完善:

所有数据文件(MDF 和 NDF)都必须可用。这个是废话,也叫真理。

如果存在多个日志文件,这些文件都必须可用。和上一句大同小异。

如果数据库是只读的,必须指定日志文件。

如果原来的数据库有全文索引,可以为它指定新目录,如果不指定的话就原样带过来了。

附加也可以用来升级数据库,可以通过一系列的语句把低版本的数据库附加到08实例上。这里知道就好,感兴趣的话可以看看

http://msdn.microsoft.com/zh-cn/library/ms189625.aspx

对于FOR ATTACH_REBUILD_LOG,要求完全关闭数据库。什么叫完全关闭我也不知道,COPY过来的。

数据库快照不能附加。

 

下一篇写CREATE DATABASE的最后一个用法:创建数据库快照,以及介绍数据库快照的相关知识。

 

希望能对菜鸟有帮助,如果有看不懂的,欢迎给我留言,大家一起研究。

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页