数据库范式理论

范式理论是为了建立冗余较小结构合理的数据库所遵循的规则。关系数据库中的关系必须满足不同的范式。目前关系数据库有六种范式:第一范式(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';

《SQL Server 2008从入门到精通》20180627的更多相关文章

  1. 《SQL Server 2008从入门到精通》--20180724

    目录 1.事务 1.1.事务的ACID属性 1.2.事务分类 1.2.1.系统提供的事务 1.2.2.用户自定义的事务 1.3.管理事务 1.3.1.SAVE TRANSACTION 1.3.2.@@ ...

  2. 《SQL Server 2008从入门到精通》--20180717

    目录 1.触发器 1.1.DDL触发器 1.2.DML触发器 1.3.创建触发器 1.3.1.创建DML触发器 1.3.2.创建DDL触发器 1.3.3.嵌套触发器 1.3.4.递归触发器 1.4.管 ...

  3. 《SQL Server 2008从入门到精通》--20180716

    1.锁 当多个用户同时对同一个数据进行修改时会产生并发问题,使用事务就可以解决这个问题.但是为了防止其他用户修改另一个还没完成的事务中的数据,就需要在事务中用到锁. SQL Server 2008提供 ...

  4. 《SQL Server 2008从入门到精通》--20180710

    目录 1.使用Transact-SQL语言编程 1.1.数据定义语言DDL 1.2.数据操纵语言DML 1.3.数据控制语言DCL 1.4.Transact-SQL语言基础 2.运算符 2.1.算数运 ...

  5. 《SQL Server 2008从入门到精通》--20180704

    XML查询技术 XML文档以一个纯文本的形式存在,主要用于数据存储.不但方便用户读取和使用,而且使修改和维护变得更容易. XML数据类型 XML是SQL Server中内置的数据类型,可用于SQL语句 ...

  6. 《SQL Server 2008从入门到精通》--20180703

    SELECT操作多表数据 关于连接的问题,在<SQL必知必会>学习笔记中已经讲到过,但是没有掌握完全,所以再学一下. JOIN连接 首先我们先来看一下最简单的连接.Products表和Ve ...

  7. 《SQL Server 2008从入门到精通》--20180628

    数据库基本概念:区.页.行 区:SQL Server中管理空间的基本单位.一个区大小为64KB,是八个物理上连续的页.SQL Server中每MB有16个区.一旦一个区被存储满,SQL Server将 ...

  8. 《SQL Server 2008从入门到精通》--20180723

    目录 1.架构 1.1.创建架构并在架构中创建表 1.2.删除架构 1.3.修改表的架构 2.视图 2.1.新建视图 2.2.使用视图修改数据 2.3.删除视图 3.索引 3.1.聚集索引 3.2.非 ...

  9. 《SQL Server 2008从入门到精通》--20180629

    约束 主关键字约束(Primary Key Constraint) 用来指定表中的一列或几列组合的值在表中具有唯一性.建立主键的目的是让外键来引用. Primary Key的创建方式 在创建表时创建P ...

随机推荐

  1. 【原】SPARK_MEM和SPARK_WORKER_MEMORY的区别

    SPARK_MEM:设置每个Job(程序)在每个节点可用的内存量:(默认为512m) SPARK_WORKER_MEMORY:设置集群中每个节点分配的最大内存量:(默认为内存总量减去1G)

  2. OpenGL12-shader(GLSL)着色语言1(代码已上传)

    OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...

  3. golang闭包实现递归

    func main() { for i := 1; i < 30; i++ { fmt.Println(Fibonacci(i)) } } func Fibonacci(n int) int { ...

  4. 判断产品Key的正则表达式(格式: ABCD1-ABCD2-ABCD3-ABCD4-ABCD5)

    正则表达式: ^[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}-[A-Za-z0-9]{5}$ 改进: ^([A-Za-z0-9 ...

  5. NodeJS调用jar包

    我们在实际的生产.开发实践中,其实要和许多第三方服务商进行打交道,这其中包括使用他们提供的批量与联机服务,但与别的互联网企业不大相同的是,银行作为传统企业,其一贯重视安全性,许多在互联网企业看似理所当 ...

  6. Docker中“TERM environment variable not set.”问题

    在使用top查容器内部资源利用情况时候,发现无法使用,报“TERM environment variable not set.”错误.从网上找到了解决方案,经实验有效 root@103b5f05462 ...

  7. 2 字节的 UTF-8 序列的字节 2 无效 解决方法

    2 字节的 UTF-8 序列的字节 2 无效 解决方法: 用记事本打开xml文件,另存为 编码 选择 UTF-8,保存替换掉之前的文件,解决问题

  8. sql 数据库数据 批量判断修改

    A表B表相关联  更新B表中的VisitWeek字段值 CCD_PartnerVisit 此为B表 Dell_FiscalWeek  此为A表 UPDATE CCD_PartnerVisit SET ...

  9. @Value失效的问题

    @Value 会在@Controller中失效,失效原因涉及源码问题就不一一叙述了,一般加上@Service,@Component就能解决.如果是在Controller中使用建议新建一个配置类,然后在 ...

  10. tcpcopy + tcpdump 离线回放

    简单来说,就是用tcpdump记录线上请求,用tcpcopy来重放,如下图所示:   有关 tcpdump 的命令详解请参考: http://www.cnblogs.com/ggjucheng/arc ...