时间:2021-07-01 10:21:17 帮助过:10人阅读
关键列说明:
| type | File type: 0 = Rows (includes full-text catalogs upgraded to or created in SQL Server 2008) 1 = Log 2 = FILESTREAM 3 = Reserved for future use 4 = Full-text (includes full-text catalogs from versions earlier than SQL Server 2008) |
| name | The logical name of the fi le |
| physical_name | Operating-system fi le name |
| size | Current size of the fi le, in 8-KB pages. 0 = Not applicable For a database snapshot, size refl ects the maximum space that the snapshot can ever use for the fi le. |
| max_size | Maximum fi le size, in 8-KB pages: 0 = No growth is allowed. –1 = File will grow until the disk is full. 268435456 = Log fi le will grow to a maximum size of 2 terabytes. |
| growth | 0 = File is a fi xed size and will not grow. >0 = File will grow automatically. If is_percent_growth = 0, growth increment is in units of 8-KB pages, rounded to the nearest 64 KB. If is_percent_growth = 1, growth increment is expressed as a whole number percentage. |

一个新的用户数据库不能小于3MB(包括日志文件)。并且主数据文件的大小不能小于model数据库的主数据文件大小。创建数据库时,尽可能地使用默认值创建。因此创建一个数据库的简单sql语句如下:
CREATE DATABASE newdb;
执行该语句后,newdb数据库拥有默认的大小、newdb和newdb_log两个逻辑名称、物理文件newdb.mdf和newdb_log.ldf被创建在默认的文件夹。
接下来给出一个完成的创建数据库语句:
| CREATE DATABASE Archive ON PRIMARY ( NAME = Arch1, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\archdat1.mdf‘, SIZE = 100MB, MAXSIZE = 200MB, FILEGROWTH = 20MB), ( NAME = Arch2, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\archdat2.ndf‘, SIZE = 10GB, MAXSIZE = 50GB, FILEGROWTH = 250MB) LOG ON ( NAME = Archlog1, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\archlog1.ldf‘, SIZE = 2GB, MAXSIZE = 10GB, FILEGROWTH = 100MB); |
| CREATE DATABASE Sales ON PRIMARY ( NAME = salesPrimary1, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesPrimary1.mdf‘, SIZE = 100, MAXSIZE = 500, FILEGROWTH = 100 ), ( NAME = salesPrimary2, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesPrimary2.ndf‘, SIZE = 100, MAXSIZE = 500, FILEGROWTH = 100 ), FILEGROUP SalesGroup1 ( NAME = salesGrp1Fi1e1, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp1Fi1e1.ndf‘, SIZE = 500, MAXSIZE = 3000, FILEGROWTH = 500 ), ( NAME = salesGrp1Fi1e2, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp1Fi1e2.ndf‘, SIZE = 500, MAXSIZE = 3000, FILEGROWTH = 500 ), FILEGROUP SalesGroup2 ( NAME = salesGrp2Fi1e1, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp2Fi1e1.ndf‘, SIZE = 100, MAXSIZE = 5000, FILEGROWTH = 500 ), ( NAME = salesGrp2Fi1e2, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\salesGrp2Fi1e2.ndf‘, SIZE = 100, MAXSIZE = 5000, FILEGROWTH = 500 ) LOG ON ( NAME = ‘Sales_log‘, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\saleslog.ldf‘, SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ); |
| ALTER DATABASE Test1 ADD FILEGROUP Test1FG1; GO ALTER DATABASE Test1 ADD FILE ( NAME = ‘test1dat4‘, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\t1dat4.ndf‘, SIZE = 500MB, MAXSIZE = 1000MB, FILEGROWTH = 50MB), ( NAME = ‘test1dat5‘, FILENAME = ‘c:\program files\microsoft sql server\mssql.1\mssql\data\t1dat5.ndf‘, SIZE = 500MB, MAXSIZE = 1000MB, FILEGROWTH = 50MB) TO FILEGROUP Test1FG1; GO ALTER DATABASE Test1 MODIFY FILEGROUP Test1FG1 DEFAULT; GO |

接下来我们讨论一些比较重要的数据库属性
(1)状态属性
| a. SINGLE_USER | RESTRICTED_USER | MULTI_USER | 用来描述用户访问数据库的属性。 例如: ALTER DATABASE Sample SET SINGLE_USER; SINGLE_USER表示某一时刻之允许有一个链接; RESTRICTED_USER表示用户仅仅拥有dbcreator、sysadmin server角色或者是数据库db_owner,才可以访问数据库; MULTI_USER表示任意用户连接。你可以通过SELECT USER_ACCESS_DESC FROM sys.databases WHERE name = ‘<name of database>‘查看数据库用户访问属性。 |
| b. OFFLINE | ONLINE | EMERGENCY | 数据库设置成OFFLINE后该数据库就不能被修改;如果当前有任何用户链接,数据库也不能设置成OFFLINE。 修改语句如下: ALTER DATABASE Sample SET OFFLINE; SELECT state_desc from sys.databases WHERE name = ‘Sample‘; |
| c. READ_ONLY | READ_WRITE | 该组属性设置数据库读写模式,默认是READ_WRITE可读可写,READ_ONLY表示只读,没有INSERT, UPDATE, or DELETE操作。 例如: ALTER DATABASE Sample SET READ_ONLY; SELECT name, is_read_only FROM sys.databases WHERE name = ‘Sample ‘; |
| a. ANSI_NULLS | 如果设置为ON,任何和NULL比较返回UNKNOW;如果设置为OFF,如果两个都是NULL比较结果为TRUE |

当一个进程从快照中读取数据,它首先访问位图确认快照是否包含需要访问页数据。请看下图,我们访问快照,9页数据来源于数据源,一页数据来源于快照。但是通过这种访问形式,不论当前是什么隔离级别,我们访问的数据不会有任何的锁行为。这也是使用快照的一大优势。

必须注意的是,这些位图是存储在缓存中,而不是它自身的文件里边,因此我们需要的时候都能读到它。当数据库重启后,这些位图丢失,需要重新启动构建。
tempdb数据库| ■ database_id (even though the DBID 2 is the only one used) ■ file_id ■ unallocated_extent_page_count ■ version_store_reserved_page_count ■ user_object_reserved_page_count ■ internal_object_reserved_page_count ■ mixed_extent_page_count |
管理数据库安全
登录名是数据库的拥有者,我们可以在sys.databases视图中查看到SID列,这一列表示登录的SID,并且这个SID拥有这个数据库。数据库的资源被登陆用户所拥有。像你说看到的,数据库的所有对象被数据库Principals拥有。 执行以下语句:
select d.name, d.database_id, p.name
from sys.databases d
inner join sys.server_principals p
on d.owner_sid = p.sid
查看结果:

我们可以查到,master数据库的拥有者为sa登陆名。同时也可以看出数据库中也有一个叫做sa的Principal。
每个数据库都有一个sys.database_principals目录视图,通过这个视图,你可以了解登陆名和数据库中的用户对应关系。下面的查询语句展示了示例数据库中的用户和登陆名的映射关系,也展示了每个数据库用户的默认对象集合schema。
sql语句如下:
select d.name, d.database_id, p.name
from sys.databases d
inner join sys.server_principals p
on d.owner_sid = p.sid
执行结果如下:
)_%60%25g0~%248.png)
分析:登录名sa有用户名称dbo。dbo是一个特殊的登录,dbo被sa登录使用(也被所有的sysadmin角色登录使用,包括在sys.databases罗列的数据库的所有登录)。
数据库和Schemas有什么关系?在ANSI SQL-92标准里,一个schema被定义作为数据库对象的集合,这个集合被单个用户拥有并且在同一个命名空间下。一个命名空间是一些列对象的集合,这个集合中的对象名称是不能重复的。
登录用户(Principals)和Schemas有什么关系?在Sql Server2008,用户和schemas是两个独立的东西。为了理解它们的不同,我们可以认为权限被授予用户(Principals),但对象存放在schemas里边。创建一个新用户一般默认schema都是dbo。
默认的Schemas是怎样的?当你创建一个数据库时,若干schemas包含在数据库中。它们包括dbo、INFORMATION_SCHEMA、guest。另外,每个数据库都有一个叫做sys的schemas,sys提供访问所有的系统表和视图。
移动、拷贝数据库
你可以通过简单的存储过程分离一个数据库,分离时需要保证该数据库没有任何连接。如果存在连接,你可以使用ALTER DATABASE 设置数据库为SINGLE_USER模式中断已存在的连接。一旦分离了数据库,该数据库在sys.databas、system tables中的记录被移除。
分离数据库的指令为:EXEC sp_detach_db <name of database>。例如我们有一个叫做heavi_case2的数据库,我们先执行sql:
select * from sys.databases。结果如下:
jvcd2x.png)
现在我们执行分离数据库指令分离heavi_case2数据库。sql如下:
EXEC sp_detach_db heavi_case2;
然后再查看sys.databases表中的数据。通过结果可以看出heavi_case2已从表中移除。

分离数据库后,我们考虑怎样附件数据库。附件数据库可以使用CREATE DATABASE和FOR
ATTACH选项。语法如下:
CREATE DATABASE database_name
ON <filespec> [ ,...n ]
FOR { ATTACH
| ATTACH_REBUILD_LOG }
需要说明的是,以上语句只需要一个关键文件即可,因为关键文件已经包含了其他文件的位置。但是如果其他文件在不同的路径下就需要附加说明。现在我们根据以上语法把数据库heavi_case2附件到数据库上,在附加之前我们故意把heavi_case2.ldf文件移至其他目录下,然后执行以下语句:
CREATE DATABASE heavi_case2
ON
(NAME = heavi_case2,
FILENAME =
‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\heavi_case2.mdf‘
)
FOR ATTACH
查看执行结果:New log file ‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\heavi_case2_log.ldf‘ was created.。数据库直接创建了新的日志文件。考虑一种情况:如果我们想拷贝数据库并且日志文件很大时,我们可以不要日志文件,附件数据库时新建日志文件。
Sql Server来龙去脉系列之一 目录篇
Sql Server来龙去脉系列之二 框架和配置
Sql Server来龙去脉系列之三 查询过程跟踪
Sql Server来龙去脉系列之四 数据库和文件
Sql Server来龙去脉系列之五 日志以及恢复
Sql Server来龙去脉系列之六 表
Sql Server来龙去脉系列之七 索引
Sql Server来龙去脉系列之八 比较特殊的存储
Sql Server来龙去脉系列之九 查询优化
Sql Server来龙去脉系列之十 计划缓存
Sql Server来龙去脉系列之十一 事务和并发
Sql Server来龙去脉系列之四 数据库和文件
标签: