数据库范式理论
范式理论是为了建立冗余较小结构合理的数据库所遵循的规则。关系数据库中的关系必须满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF、第四范式(4NF)、第五范式(5NF)
第一范式
对象的任意属性不能被拆分,每个属性有且仅有一个值,即没有重复的行,没有重复的列。
第二范式
在第一范式的基础上,要求所有非主属性都与主属性完全相关。假设属性1和属性2为主属性,属性3为非主属性,如果属性1或者属性2能唯一确定属性3,则不符合2NF,只有(属性1+属性2)能唯一确定属性3(有助于数据库基础性操作的实现)才符合2NF
第三范式
在第二范式的基础上,要求除主键外其他字段不相关,不存在依赖性。比如一张表中非主属性1,2,3,属性1=属性2-属性3,则该表不满足第三范式。(不要在数据库中存储可以简单计算得出的数据)
BCNF
在第三范式基础上,要求表中所有字段(包括主键)都互不相关,不存在依赖性。即主属性不依赖于主属性。
第四范式
表内不存在多对多关系。如果A和B是1:N的关系,A和C是1:N的关系,B和C互相独立,则不满足第四范式。
第五范式
在第四范式的基础上,可以分解成更小的表。从最终结构重新建立原始结构。
Transact-SQL行构造器
例:用INSERT语句一次性插入多行数据
CREATE TABLE a( Column1 NVARCHAR(max), Column2 NVARCHAR(max) ); Go INSERT INTO a VALUES(‘1’,’1’),(‘2’,’2’),(‘3’,’3’);
用存储过程新建登录名和用户名
创建登录名huyan1,密码111111,默认数据库test,切换到test数据库下,创建登录名huyan1在test数据库中的用户hy1
EXECUTE sp_addlogin ‘huyan1’,’111111’,’test’ USE test EXEC sp_adduser 'huyan1','hy1'
或使用sp_grantdbaccess创建一个与登录名相同的数据库用户名。
EXEC sp_addlogin 'hy2'; GO USE test EXEC sp_grantdbaccess 'hy2'
注:仅创建登录名而没有创建数据库用户名,该登录名无法正常登录数据库。可以使用sql语句创建数据库用户名,或者右键登录名—属性—用户映射中勾选数据库。创建和删除数据库用户名语句必须在该数据库下执行。用户名hy1默认权限public。
删除新建的登录名:
EXECUTE sp_droplogin ‘huyan1’
删除新建的用户名:
USE test; EXECUTE sp_dropuser ‘hy1’
用户权限
主要语句
USE test; GRANT SELECT,UPDATE,DELETE ON Customers TO huyan1 REVOKE SELECT,UPDATE,DELETE ON Customers TO huyan1
注: GRANT语句必须在目标数据库下执行。
授予用户权限的前提
(1)创建登录名huyan1,密码111111,默认数据库test
EXCUTE sp_addlogin ‘huyan1’,’111111’,’test’
(2)在huyan1登录名的目标数据库test下创建用户hy
USE test; CREATE USER hy FOR LOGIN huyan1 WITH DEFAULT_SCHEMA=test;
或者右键点击huyan1登录名,在属性—用户映射中勾选test数据库,系统会自动在test数据库下添加huyan1的用户
授予权限
USE test; GRANT SELECT,UPDATE,DELETE ON Customers TO hy
注:这里的hy指的是数据库用户名而非登录名。
撤销权限
撤销用户hy在Customers表中的SELECT,UPDATE,DELETE权限
USE test; REVOKE SELECT,UPDATE,DELETE ON Customers TO hy
拒绝权限
拒绝用户hy在Customers表中的DELETE权限
USE test; DENY DELETE ON Customers TO hy
注:REVOKE和DENY的区别在于,用户权限被DENY后无法通过其组或角色成员身份继承该权限,而权限被REVOKE后还可以通过继承和授予得到。
创建角色并分配给用户
在test数据库下,用存储过程创建角色p_test,该角色的所有者为hy。为p_test角色授予Customers表的所有权限。用存储过程为角色p_test分配成员用户hy。
USE test EXEC sp_addrole ‘p_test’,’hy’; GRANT ALL ON Customers TO p_test; EXEC sp_addrolemember ‘p_test’,’hy’;
注:角色所有者hy并不是角色成员。用EXEC sp_addrole ‘p_test’,’hy’语句创建角色p_test并设置所有者为hy,并不代表hy是p_test的成员,拥有p_test角色的权限。
为角色p_test移除成员hy
EXEC sp_droprolemember ‘p_test’,’hy’;
服务器角色
bulkadmin:允许运行BULK INSERT语句,用于从文本中大量插入数据到数据库中
dbcreator:允许创建,修改,删除和还原任何数据库,适用于助理DBA和开发人员
diskadmin:允许管理磁盘文件,比如镜像数据库和添加备份设备,适用于助理DBA
processadmin:允许多任务化的管理,可以通过多个进程做多件事情,也可以删除进程
securityadmin:安全管理员,管理登录名及其属性
serveradmin:服务管理员,更改服务器的配置选项和关闭服务器
setupadmin:管理链接服务器,控制启动的存储过程
sysadmin:有权执行任何任务,仅适用于数据库管理员
数据库角色
标准角色
允许用户适用单一的权限来创建角色。如创建一个叫User的角色,允许用户INSERT,SELECT,UPDATE数据库中的指定表,不允许其他任务。
应用程序角色
允许用户为特定应用程序创建密码保护
预定义数据库角色
这些角色是内置的,不能被更改权限
(1) db_owner:可以做其他角色能做的所有事情,还可以做一些管理性操作
(2) db_accessadmin:可以通过添加或删除用户指定谁可以访问数据库
(3) db_securityadmin:可以修改角色成员身份和管理权限
(4) db_dlladmin:可以在数据库中运行所有DLL命令,创建修改和删除数据库对象而不必浏览其数据
(5) db_backupoperator:备份数据库
(6) db_datareader:读取所有用户所有表中的数据
(7) db_datawriter:可以添加更改删除所有用户所有表中的数据
(8) db_denydatareader:不能读取任何用户任何表中的数据
(9) db_denydatawriter:不能对任何用户任何表中的数据做添加更改删除的操作
(10) public:每个数据库用户都属于public角色,未对用户授予权限时该用户将继承public权限。该角色不能被删除。
系统数据库
master数据库
存储了登录名和用户ID所属角色,系统配置,数据库名和初始化信息,是最重要的数据库。
model数据库
存储了创建数据库时的一些预定义标准如数据库初始大小,特定信息集等,是tempdb数据库的基础。
tempdb数据库
临时性数据库,在sql server2008启动时新建,在sql server2008关闭时丢失。主要存储用户建立的临时表和临时存储过程。
msdb数据库
给sql server2008提供必要的信息来运行作业。
数据库文件和日志
主数据文件
一个数据库对应一个主数据文件,扩展名为.mdf,包含数据库的启动信息并指其他文件,用户数据和对象可存储在主数据文件中,也可以存储在辅助数据文件中。
辅助数据文件
可选的,由用户定义存储用户数据的文件,扩展名为.ndf,当数据库超过单个Windows文件的最大限制,可使用辅助数据文件将数据分散到多个磁盘上,使数据库能够继续增长。
事务日志文件
保存了用于恢复数据库的日志信息,每个数据库必须至少有1个日志文件。扩展名为.ldf。
数据库快照(database snapshot)
数据库快照是源数据库的静态只读视图,与源数据库位于同一服务器实例上,与源数据库在事务上一致,源数据库更新时,数据库快照也将更新。一个数据库可以存在多个数据库快照。
优点
(1) 用于报告目的。客户端可以查询数据库快照,以便利用创建快照时的数据编写报表。
(2) 用于保存历史数据以生成报表。数据库快照保留了某个时间点的历史数据,方便用户日后对该时间点的历史数据生成报表。
(3) 通过带有镜像数据库的数据库快照来访问镜像数据库,释放主体数据库上的资源。
(4) 使数据免受管理失误带来的影响
(5) 如果源数据库上出现用户错误,可以将数据库恢复到创建数据库快照时的状态。
(6) 管理测试数据库。在第一轮测试开始前,对测试数据库创建数据库快照。在测试结束后可利用数据库快照将数据库恢复到测试前的状态,以便重新开始测试。
注:数据库快照与源数据库相关,且无法对脱机和损坏的数据库进行恢复,不能替代备份和还原。所有恢复模式都支持数据库快照。
数据库快照的限制
(1) 数据库快照存在期间,不能对源数据库进行分离,还原和删除操作,但可以备份。
(2) 每次更新源数据库时都会对快照进行“写入时复制”操作,源数据库的I/O性能受到影响。
(3) 不能从源数据库或任何快照中删除文件。
(4) 必须与源数据库在同一个服务器实例上创建和保存。
(5) 依赖于源数据库,但不是冗余存储,无法防止磁盘错误或其他类型的损坏。
(6) 快照更新时用尽磁盘空间或遇到其他错误,则成为可以快照,必须删除。
(7) 快照只读,无法升级,因此升级后不可用。
(8) 无法对model数据库,tempdb数据库,master数据库创建快照。
(9) 不能附加,分离,备份,还原数据库快照,不能对数据库快照中的文件进行删除。
创建数据库快照的唯一方式是使用Transact-SQL语句。且Microsoft SQL Server Management Studio不支持数据库快照。
创建数据库快照
CREATE DATABASE test_snapshot_201806271505 ON ( NAME=test, FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_snapshot_201806271505.ss' )AS SNAPSHOT OF test; GO
上述代码中,test_snapshot_201806271505是快照名称,NAME=test中的test是源数据库的逻辑名称,可右键数据库—属性—文件查看。FILENAME中填写的是快照的稀疏文件存储路径,其中test_snapshot_201806271505.ss是稀疏文件的名称,最后一个test是源数据库名称(并非逻辑名称)。
注:实际在SQL Server Management Studio中运行上述语句创建数据库快照,并未运行成功。
消息1844,级别16,状态1,第1 行
Express Edition with Advanced Services (64-bit) 不支持Database Snapshot。
恢复数据库快照
USE master RESTORE DATABASE test FROM DATABASE_SNAPSHOT='test_snapshot_201806271505'; GO
上述代码中,test是源数据库名称,test_snapshot_201806271505是快照名称。
删除数据库快照
DROP DATABASE test_snapshot_201806271505;
注:用数据库快照恢复数据库时,源数据库不能存在多个快照,也不能存在任何只读或压缩文件组,创建快照时联机现在脱机的文件。
创建和修改数据库
创建数据库
CREATE DATABASE 教务管理系统 ON( NAME='教务管理系统_DATA', FILENAME='E:\教务管理系统_DATA.mdf', SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=5% ) LOG ON( NAME='教务管理系统_LOG', FILENAME='E:\教务管理系统_LOG.ldf', SIZE=2MB, MAXSIZE=10MB, FILEGROWTH=1MB )
修改数据库名称
ALTER DATABASE 教务管理系统 MODIFY NAME=database_name;
或者使用存储过程
EXEC sp_renamedb 'database_name','School_MIS';
修改数据库大小
可以通过为数据库新增一个次要数据库文件实现增大数据库容量
ALTER DATABASE School_MIS ADD FILE( NAME='School_MIS1', FILENAME='E:\School_MIS1.mdf', SIZE=3MB, MAXSIZE=10MB, FILEGROWTH=10% )
上述代码中将新增的次要文件命名为School_MIS1,存储路径为E:\School_MIS1.mdf,初始大小为3MB,增长的最大限制为10MB,自动增长的增量为10%
查看数据库状态
(1) 通过查询master表中的sys.databases视图的state_desc列值来查看数据库状态,查询条件是数据库名称name
SELECT state_desc FROM sys.databases WHERE name='test'
(2) 通过使用DATABASEPROPERTYEX()函数的STATUS属性来查看状态
USE test GO SELECT DATABASEPROPERTYEX('test','STATUS') AS '当前数据库状态';
SQL Server 2008提供了多种方法来查看数据库信息,如使用master数据库中的sys.database_files查看数据库文件信息,sys.filegroups查看数据库组的信息,sys.maste_files查看数据库文件基本信息和状态信息。除了目录视图和函数,还可以通过存储过程sp_spaceused查看数据库使用和保留的空间。
USE test GO EXEC sp_spaceused;
使用sp_helpdb查看数据库基本信息
EXEC sp_helpdb 'test';
分离和附加数据库
分离数据库
将数据库从SQL Server实例中删除,但使数据库在其数据文件和事务日志文件中保持不变,之后就可以使用这些文件将数据库附加到任意SQL Server实例。
下列情况不能分离数据库:
已复制并发布的数据库不能分离,如果数据库已发布,必须通过运行sp_replicationdboption禁用发布后才能分离。
如果数据库中存在快照,必须删除所有快照才能进行分离。
该数据库正在某个数据库镜像会话中进行镜像。
数据库处于可以状态不能分离。
数据库是系统数据库不能进行分离。
分离数据库命令
USE master EXEC sp_detach_db 'test';
附加数据库
利用分离出的数据文件和事务日志文件将数据库附加到其他服务器实例。可以附加复制的和分离的数据库。
附加数据库命令
无日志附加数据库命令
CREATE DATABASE test ON( FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test.mdf' )FOR ATTACH_REBUILD_LOG;
多个.mdf,.ndf,.ldf文件附加数据库命令
CREATE DATABASE School_MIS ON( FILENAME='E:\教务管理系统_DATA.mdf'), (FILENAME='E:\School_MIS1.mdf'), (FILENAME='E:\test_data.ndf' )LOG ON( FILENAME='E:\教务管理系统_LOG.ldf' )FOR ATTACH;
存储过程附加数据库命令
EXEC sp_attach_db @dbname='School_MIS', @filename1='E:\教务管理系统_DATA.mdf', @filename2='E:\School_MIS1.mdf', @filename3='E:\test_data.ndf', @filename4='E:\教务管理系统_LOG.ldf';