MSSQL → 02:数据库结构

一、数据库的组成

  在SQL Server 2008中,用户如何访问及使用数据库,就需要正确了解数据库中所有对象及其设置。数据库就像一个容器,它里面除了存放着数据的表之外,还有视图、存储过程、触发器、约束等数据库对象。数据库管理的核心任务包括创建、操作和维护数据库。

二、数据库文件及其文件组

  数据库的存储结构分为逻辑存储结构和物理存储结构。

  • 逻辑存储结构:说明数据库是由哪些性质的信息所组成。SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息都存储在数据库中。
  • 物理存储结构:数据库在磁盘上是以文件为单位存储的,由数据库文件和事务日志文件组成,一个数据库至少应该包含一个数据库文件和一个事务日志文件。

  SQL Server数据库系统中的数据库文件是由数据文件和日志文件组成的,数据文件以盘区为单位存储在存储器中。

2.1、数据文件

  数据库文件是指数据库中用来存放数据库数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件只能属于一个数据库。当有多个数据库文件时,有一个文件被定为主数据文件,用来存储数据库的启动信息和部分或全部数据,一个数据库只能有一个主数据库文件。数据文件则划分为不同的页面和区域,页是SQL Server存储数据的基本单位。

  • 主数据文件:是数据库的起点,指向数据库文件的其他部分,每个数据库都有一个主要数据文件,扩展名为.mdf。
  • 次数据文件:包含除主数据库文件之外的所有数据文件,一个数据库可以没有次数据文件,也可以有多个次数据文件,扩展名为.ndf。
  • 事务日志文件:包含恢复数据库所有事务日志的信息。每个数据库必须至少有一个事务日志文件,当然也可以有多个,事务日志文件的推荐文件扩展名是.ldf
  • 文件流( Filestream):可以使得基于 SQLServer的应用程序能在文件系统中存储非结构化的数据,如文档、图片、音频等,文件流主要将SQLServer数据库引擎和新技术文件系统(NTFS)集成在一起,它主要以varbinary (max)数据类型存储数据。

2.2、日志文件

  SQL Server的日志是由一系列日志记录组成,日志文件中记录了存储数据库的更新情况等事务日志信息,用户对数据库进行的插入、删除和更新等操作都会记录在日志文件中。当数据库损坏时,可以根据日志文件来分析出错的原因,或者数据丢失时,还可以使用事务日志恢复数据库。每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。
  SQL Server2012不强制使用.mdf、.ndf或者.ldf作为文件的扩展名,但建议使用这些扩展名帮助标准文件的用途。数据库中的所有文件的位置都记录在master数据库和该数据库在主数据文件中。

三、数据库的分类

3.1、系统数据库:由系统服务提供

  SQLServer系统数据库分别是:master、model、tempdb、msdb数据库。

  3.1.1、master数据库

  master是SQL Server中最重要的数据库,是整个数据库服务器的核心。用户不能直接修改master数据库,如果master数据库损坏了,那么整个SQL Server服务器将不能工作。
  master数据库中包含了以下的一些内容:

  • 所有用户的登录信息
  • 用户所在的组
  • 所有系统的配置选项
  • 服务器中本地数据库的名称和信息
  • SQL Server的初始化方式等

  master数据库保存系统表用于系统的总体控制。如在新建一个数据库时,在master数据库的sysdatabases表中插入对应的记录。
  作为一个数据库管理员,应该定期备份master数据库。

  3.1.2、model数据库

  model数据库是SQL Server中创建数据库的模板,如果用户

  • 希望创建的数据库有相同的初始化文件大小,则可以在model数据库中保存文件大小的信息;
  • 希望所有的数据库中都有相同的一个或多个表,可以将该数据表保存在model数据库中

  新创建的数据库以model数据库中的数据作为模板,因此在修改model数据库之前要考虑到,任何对model数据库中数据的修改都要影响到所有使用该模板创建的数据库。
  由于model数据库作为其他任意数据库的模板,系统中必须保留,不能删除。
  在更改model数据库时需要注意:任意新建的数据库至少要比model数据库大。如果将model数据库大小更改为100MB,则不能创建小于100MB的数据库。

  3.1.3、tempdb数据库

  msdb提供了运行SQL Server Agent工作的信息。SQL Server Agent是SQL Server中的一个Windows服务,该服务用来运行制定的计划任务。如在计划对一个数据库每夜进行备份时,则在msdb数据库中有一个相应的记录项。

  3.1.4、msdb数据库

  tempdb是SQL Server中的一个临时数据库,用于存放临时对象或中间结果,只要创建临时表,则临时表会创建在tempdb数据库中。SQL Server关闭后,该数据库中的内容被清空,每次重新启动服务器之后,tempdb数据库将被完全重建。

  Tempdb数据库保存系统运行过程中产生的临时表和存储过程。当然,它还满足其他的临时存储要求,比如保存SQL Server生成的存储表等。Tempdb数据库是一个全局咨询,任何连接到系统的用户都可以在该数据中产生临时表和存储过程。Tempdb数据库在每次SQL Server启动的时候,都会清空该数据库中的内容,所以每次启动SQL Server后,该表都是干净的。临时表和存储过程在连接断开后会自动除去,而且当系统关闭后不会有任何活动连接,因此,Tempdb数据库中没有任何内容会从SQL Server的一个会话保存到另一个会话中。
  默认情况下,在SQL Server在运行时Tempdb数据库会根据需要自动增长。不过,与其它数据库不同,每次启动数据库引擎时,它会重置为其初始大小。如果为Tempdb数据库定义的大小较小,则每次重新启动SQL Server时,将Tempdb数据库的大小自动增加到支持工作负荷所需的大小这一工作可能会成为系统处理负荷的一部分。为避免这种开销,可已使用ALTER DATABASE 增加Tempdb数据库的大小。

3.2、用户数据库:用户或程序员创建的数据库

四、创建数据库用户及授权

  • 使用SSMS图形界面创建数据库

   ①、打开安全性--登录名,右键 新建用户

  

  ②、此时会出现Windows和SQL server身份验证

  ③、此时先选择Windows身份登录,点击 搜索,则弹出 选择用户和组的弹出框,在其中输入Windows系统中的用户

  

 

  ④、打开 控制面板--选择用户账户--管理其他账户---选择一个新账户,此时选择fww用户

  

  ⑤、在输入框中写入fww,点击 检查名称,则自动加入了全名

   ⑥、则在登录名中自动代入了Windows用户,点击确定,则用户添加成功。

  

  ⑦、断开此时的连接

  ⑧、新建fww对应的连接,但是此时账户默认为Administrator,且为灰色,无法更改

  

  ⑨、按Alt+ Ctrl+Delete键,切换用户

  

  ⑩、则Sqlserver的登录账户则变为BalmyLee

  

  ⑪、输入账户信息,则用户登录成功。

  • 使用Transact-SQL 语句创建用户

  ①、首先在 SQL Server 服务器级别,创建登陆帐户(create login)

  语法:

CREATE LOGIN 用户名 PASSWORD='密码' DEFAULT_DATABASE=数据库;

  示例:

--创建登陆帐户(create login)
create login dba with password='abcd1234@', default_database=LibraryDB;

  ②、创建数据库用户(create user)

  语法:

CREATE USER 用户名 FOR LOGIN 登录用户名 WITH DEFAULT_SCHEMA=数据库;

  示例:

--为登陆账户创建数据库用户(create user),在mydb数据库中的security中的user下可以找到新创建的dba
create user dba for login dba with default_schema=LibraryDB

  并指定数据库用户“dba” 的默认 schema 是“LibraryDB”。这意味着 用户“LibraryDB” 在执行“select * from t”,实际上执行的是 “select * from LibraryDB.t”。

③、通过加入数据库角色,赋予数据库用户“dba”权限

语法:

 

格式:

--通过加入数据库角色,赋予数据库用户“db_owner”权限
exec sp_addrolemember 'db_owner', 'dba'

此时,dba 就可以全权管理数据库 mydb 中的对象了。
如果想让 SQL Server 登陆帐户“dba”访问多个数据库,比如 mydb2。 可以让 sa 执行下面的语句:

--让 SQL Server 登陆帐户“dba”访问多个数据库
use mydb2
go
create user dba for login dba with default_schema=dbo
go
exec sp_addrolemember 'db_owner', 'dba'
go

  此时,dba 就可以有两个数据库 mydb, mydb2 的管理权限了!

  ④、完整的代码示例

--创建数据库mydb和mydb2--在mydb和mydb2中创建测试表,默认是dbo这个schema
CREATE TABLE DEPT(DEPTNO int primary key,DNAME VARCHAR(14),LOC VARCHAR(13) );--插入数据
INSERT INTO DEPT VALUES (101, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (201, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (301, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (401, 'OPERATIONS', 'BOSTON');--查看数据库schema, user 的存储过程
select * from sys.database_principals
select * from sys.schemas 
select * from sys.server_principals--创建登陆帐户(create login)
create login dba with password='abcd1234@', default_database=mydb--为登陆账户创建数据库用户(create user),在mydb数据库中的security中的user下可以找到新创建的dba
create user dba for login dba with default_schema=dbo--通过加入数据库角色,赋予数据库用户“db_owner”权限
exec sp_addrolemember 'db_owner', 'dba'--让 SQL Server 登陆帐户“dba”访问多个数据库
use mydb2
go
create user dba for login dba with default_schema=dbo
go
exec sp_addrolemember 'db_owner', 'dba'
go--禁用登陆帐户
alter login dba disable
--启用登陆帐户
alter login dba enable--登陆帐户改名
alter login dba with name=dba_tom--登陆帐户改密码: 
alter login dba with password='aabb@ccdd'--数据库用户改名: 
alter user dba with name=dba_tom--更改数据库用户 defult_schema: 
alter user dba with default_schema=sales--删除数据库用户: 
drop user dba--删除 SQL Server登陆帐户: 
drop login dba
  • 使用存储过程创建用户

  下面一个实例来说明在sqlserver中如何使用存储过程创建角色,重建登录,以及如何为登录授权等

/*--示例说明示例在数据库InsideTSQL2008中创建一个拥有表HR.Employees的所有权限、拥有表Sales.Orders的SELECT权限的角色r_test随后创建了一个登录l_test,然后在数据库InsideTSQL2008中为登录l_test创建了用户账户u_test同时将用户账户u_test添加到角色r_test中,使其通过权限继承获取了与角色r_test一样的权限最后使用DENY语句拒绝了用户账户u_test对表HR.Employees的SELECT权限。经过这样的处理,使用l_test登录SQL Server实例后,它只具有表Sales.Orders的select权限和对表HR.Employees出select外的所有权限。
--*/USE InsideTSQL2008--创建角色 r_test
EXEC sp_addrole 'r_test'--添加登录 l_test,设置密码为pwd,默认数据库为pubs
EXEC sp_addlogin 'l_test','a@cd123','InsideTSQL2008'--为登录 l_test 在数据库 pubs 中添加安全账户 u_test
EXEC sp_grantdbaccess 'l_test','u_test'--添加 u_test 为角色 r_test 的成员
EXEC sp_addrolemember 'r_test','u_test'--用l_test登陆,发现在SSMS中找不到仍和表,因此执行下述两条语句出错。
select * from Sales.Orders
select * from HR.Employees--授予角色 r_test 对 HR.Employees 表的所有权限
GRANT ALL ON HR.Employees TO r_test
--The ALL permission is deprecated and maintained only for compatibility. 
--It DOES NOT imply ALL permissions defined on the entity.
--ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。--测试可以查询表HR.Employees,但是Sales.Orders无法查询
select * from HR.Employees--如果要收回权限,可以使用如下语句。(可选择执行)
revoke all on HR.Employees from r_test
--ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。--授予角色 r_test 对 Sales.Orders 表的 SELECT 权限
GRANT SELECT ON Sales.Orders TO r_test--用l_test登陆,发现可以查询Sales.Orders和HR.Employees两张表
select * from Sales.Orders
select * from HR.Employees--拒绝安全账户 u_test 对 HR.Employees 表的 SELECT 权限
DENY SELECT ON HR.Employees TO u_test--再次执行查询HR.Employees表的语句,提示:拒绝了对对象 'Employees' (数据库 'InsideTSQL2008',架构 'HR')的 SELECT 权限。
select * from HR.Employees--重新授权
GRANT SELECT ON HR.Employees TO u_test--再次查询,可以查询出结果。
select * from HR.EmployeesUSE InsideTSQL2008
--从数据库中删除安全账户,failed
EXEC sp_revokedbaccess 'u_test'
--删除角色 r_test,failed
EXEC sp_droprole 'r_test'
--删除登录 l_test,success
EXEC sp_droplogin 'l_test'

revoke 与 deny的区别

revoke:收回之前被授予的权限
deny:拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。比如UserA所在的角色组有inset权限,但是我们Deny UserA使其没有insert权限,那么以后即使UserA再怎么到其他含有Insert的角色组中去,还是没有insert权限,除非该用户被显示授权。
简单来说,deny就是将来都不许给,revoke就是收回已经给予的。

示例:

GRANT INSERT ON TableA TO RoleA
GO
EXEC sp_addrolemember RoleA, 'UserA' -- 用户UserA将有TableA的INSERT权限
GOREVOKE INSERT ON TableA FROM RoleA -- 用户UserA将没有TableA的INSERT权限,收回权限
GOGRANT INSERT ON TableA TORoleA --重新给RoleA以TableA的INSERT权限
GO DENY INSERT ON TableA TO UserA -- 虽然用户UserA所在RoleA有TableA的INSERT权限,但UserA本身被DENY了,所以用户UserA将没有TableA的INSERT权限。

 

转载于:https://www.cnblogs.com/BalmyLee/p/10945979.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mySQL教程 第9章 触发器

第9章 触发器 入的新数据放到new表,删除的数据放到old表。 准备本章学习环境 连接数据库schoolDB,删除表TStudent,TScore和Tsubject中的所有数据。 delete from TStudent; delete from TScore; delete from TSubject; 向学生表插入两条记录 i…

掩码图制作photoshop__新手用

1.首先你得有一张图,比如这样的: 2.用PS打开他 3.左边工具栏里(快速选择工具W),选想显示的部分 4.ctrlc复制一下,新建一张黑底图粘贴上去或者白底图时选中显示区即花瓣右键反向右键填充成黑色 5.菜单栏->…

Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现

大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌。这期我们继续实现接下来的功能--叫地主。 1.首先这两天,学习了DOTween,这是一个强大的Unity动画插件,大家可以参考&#…

Koa 中实现 chunked 数据传输

有关于 Transfer-Encoding:chunked 类型的响应,参见之前的文章HTTP 响应的分块传输。这里看 Koa 中如何实现。 Koa 中请求返回的处理 虽然官方文档有描述说明不建议直接调用 response.write: Bypassing Koas response handling is not supported. Avoid …

HTML5新特性之Mutation Observer

Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation Observer会得到通知。 要概念上,它很接近事件。可以理解为,当DOM发生变动会触发Mutation Observer事件。但是,它与…

Python操作MongoDB - 极简教程

2019独角兽企业重金招聘Python工程师标准>>> Python 连接 MongoDB 安装PyMongo模块 pip install pymongo使用MongoClient建立连接 from pymongo import MongoClient # 以下为三种建立连接的方式 #client MongoClient() #client MongoClient(localhost, 27017) #cl…

java 省市区三级联动_AJAX省市区三级联动下拉菜单(java版)

此小程序的功能主要是采用异步请求方式从数据库中调取省市区信息显示到下拉列表:代码如下:建立数据库中的代码和一些配置文件信息就省略了,主要有JavaScript中的代码为:$(document).ready(function(){$.get("getProvince.do&…

20155305乔磊2016-2017-2《Java程序设计》第四周学习总结

20155305乔磊2016-2017-2《Java程序设计》第四周学习总结 教材学习内容总结 继承 继承就是避免多个类间重复定义共同行为。面向对象中,子类继承父类,就是把程序中相同的代码部分提升为父类。extends关键字,表示前者会扩充后者的行为&#xff…

【eclipse转idea的第一天】配置idea

为什么80%的码农都做不了架构师?>>> 导入maven项目 设置maven(全局) 为了不然才转idea的码友们重复我犯过的错,我这儿截图步骤说明下: 这里是列表文本这里是列表文本idea的设置有两种:全局,局部(我这么叫的…

Vmware 安装虚拟工具 (二)

打开虚拟机,以root超级用户登陆,菜单栏选择虚拟机,install安装虚拟机 拷贝虚拟工具到 在根目录下建立文件夹,并将工具拷贝到该文件夹,例如vmtool 打开终端,进入该目录开始安装 如图,进入目录解压…

git与svn的区别 ?Git 与 SVN那个更好?

git与svn的区别 : http://www.360doc.com/content/12/1228/20/11220452_256857021.shtml 在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题。使用Git极大地提高了开发效率、扩大了开源项目的参与度、 增强了版本控制系统…

利用Arcgis for javascript API绘制GeoJSON并同时弹出多个Popup

1.引言 由于Arcgis for javascript API不可以绘制Geojson,并且提供的Popup一般只可以弹出一个,在很多专题图制作中,会遇到不少的麻烦。因此本文结合了两个现有的Arcgis for javascript API扩充库,对其进行改造达到绘制Geojson并同…

HBase数据备份及恢复(导入导出)的常用方法

一、说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产。备份Hbase时的难点是其待备份的数据集可能非常巨大,因此备份方案必须有很高的…

Android商城开发系列(二)——App启动欢迎页面制作

商城APP一般都会在应用启动时有一个欢迎界面,下面我们来实现一个最简单的欢迎页开发:就是打开商城App,先出现欢迎界面,停留几秒钟,自动进入应用程序的主界面。 首先先定义WelcomeActivity布局,布局非常简单…

DELL安装不了mysql_Windows 版本 Mysql 8.x 安装

1、官网下载安装包百度网盘链接:https://pan.baidu.com/s/1cFRbQM5720xrzMxbgjPeyA提取码:xlz72、解压安装包并新建一个文件夹作为安装目录(mysqlInstall)3、配置 Mysql 环境变量4、在解压好的目录下新建一个 my.ini 文件(注意:my.ini 文件和…

Hyper-V Server联机调整虚拟硬盘大小

1. 技术概述: 从 Windows Server 2012 R2开始,管理员可以在运行虚拟机的同时,使用 Hyper-V 来扩展或压缩虚拟硬盘的大小。存储管理员可以通过对运行中的虚拟硬盘执行维护操作来避免代价不菲的停机。不再需要关闭虚拟机,这可以避免…

python网络爬虫(5)BeautifulSoup的使用示范

创建并显示原始内容 其中的lxml第三方解释器加快解析速度 import bs4 from bs4 import BeautifulSoup html_str """ <html><head><title>The Dormouses story</title></head> <body> <p class"title"><…

物联网笔记

转载于:https://www.cnblogs.com/16-C-kai/p/6596682.html

关于大学生玩网络游戏的调查问卷

1.创建问卷&#xff0c;输入调查名称 2编辑问卷 3检查问卷&#xff0c;是否有误 4.提交并发布问卷 5分享问卷 6.问卷分析 转载于:https://www.cnblogs.com/dzw1996/p/7786754.html

第六次 实验

转载于:https://www.cnblogs.com/P201821440005/p/10967987.html