- 绿色字体代表(这个不是SQL语句,属于MySQL的命令)
- SQL Server安全性管理资料
绿色字体代表(这个不是SQL语句,属于MySQL的命令)
数据库的相关概念
数据
- 数据描述事物的符号记录,是信息的具体表现
- 表达方式:数字、文字、图像、图形、声音
-
DB数据库(Database)
存储数据的“仓库”,他保存了一系列有组织的、可共享的、大量数据的集合
DBMS数据库管理系统(Database Management System)
数据库是通过DBMS创建和操作的容器实现数据定义、数据操作功能(检索数据、插入数据、更新数据、删除数据)、数据库的运行管理、数据库的建立和维护功能,常见的数据库管理系统:MySQL、Oracle、DB2、SqlServer
DBS数据库系统(Database System)
DBS是计算机中引入数据库后的系统,包括:
数据库DB
- 数据库管理系统DBMS
- 应用系统
- 数据库管理员DBA和用户 | 用户 | 用户 | 用户 | | —- | —- | —- | | 应用程序 | | | | 开发工具 | | | | DBMS | | | | 操作系统 | | | | DB | | |
数据管理技术的产生和发展
数据管理
对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题
数据处理
对数据进行加工、计算、提炼,从而产生新的有效数据的过程
数据管理技术的发展的过程
- 人工管理阶段(40年代中——50年代中)
- 文件管理系统(50年代末——60年代中)
- 数据库系统阶段(60年代末——现在) | | 人工管理 | 文件系统 | 数据库系统 | | —- | —- | —- | —- | | 谁管理数据 | 程序员 | 操作系统提供存取方法 | 系统集中管理 | | 面向谁 | 特定应用 | 基本上是特定用户 | 面向系统 | | 共享性 | 不能 | 充分共享 | 共享很弱 |
数据模型
在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据和信息,通俗地讲数据模型就是现实世界的模拟
数据模型应满足三方面要求:
能比较真实地模拟现实世界
容易为人所理解
便于在计算机上实现
现实世界 | 应用领域 |
---|---|
信息世界 | 建立概念模型 |
机器世界 | 建立逻辑模型和物理模型 |
概念模型(信息模型)
- 把现实世界中的客观对象抽象
- 实体:客观存在并可仙湖区分的事物
- 实体集:性质相同的同类实体的集合
- 属性:实体具有的某一特性
- 实体码:能将一个实体与其他实体区分开来的属性集
- 域:属性的取值范围称为该属性的域
- 实体型:用实体名及其属性名集合来抽象和刻画,同类实体称为实体型
- 联系:现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系
- 实体型间联系
- 俩个实体型 一对一联系(1:1)
- 三个实体型 一对多联系(车、1:n)
- 一个实体型 多对多联系(m:n)
- 概念模型的表示方法
关系模型 | 非关系模型 | |
---|---|---|
实体及实体间联系采用的数据结构 | 统一均为关系 | 不统一 |
操作方式 | 一次一集合 | 一次一记录 |
存储路径 | 对用户透明 | 对用户不透明 |
数据库系统的模式结构
- “型”和“值”的概念
- 型:对某一数据的结构和属性的说明
-
数据库系统(DBS)的三级模式结构
模式(Schema) :又称逻辑模式,DB的全局逻辑结构
数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
- 数据库用户的数据视图,是与某一应用有关的数据的逻辑表示外模式的地位:介于模式与应用之间
-
内模式(lnternal Schema)(也称存储模式)
是数据物理结构和存储方式的7描述
- 是数据在数据库内部的表示方式
- 记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)索引的组织方式
- 数据是否压缩存储数据是否加密
-
三级模式与二级映象
三级模式是对数据的三个抽象级别
- 二级映象在DBMS内部实现这三个抽象层次的联系和转换
关系数据库
数据模型
关系
域(D omain)
-
笛卡尔积(Cartesian Product)
-
元组(Tuple)
笛卡尔积中每一个元素(d,d2,…,d,)叫作一个n元组(n-tuple)或简称元组
分量(Component)
笛卡尔积元素( d,d2,…,dn)中的每一个值di叫作一个分量
基数
关系
定义:D×D2×.….×D,的子集叫作在域D,D,.….D,上的关系,表示为:R(D,D,..,Dn) R表示关系名,n表示关系的目或度(Degree) 当n=1时,称该关系为单元关系 当n=2时,称该关系为二元关系 关系是笛卡尔积的有限子 无限关系在数据库系统中是无意义的
码
候选码(Candidate key)
- 若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
- 在最简单的情况下,候选码只包含一个属性
在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码(All-key)
列是同质的(Homogeneous)
- 每一列中的分量是同一类型的数据,来自同一个域
- 不同的列可出自同一个域
- 列的顺序无所谓
- 任意两个元组的候选码不能完全相同
- 行的顺序无所谓,行的次序可以任意交换
- 分量必须取原子值
SQL语句的分类
- DQL(数据查询语言): 查询语句,凡是select语句都是DQL
- DML(数据操作语言):insert delete update,对表当中的数据进行增删改
- DDL(数据定义语言):create drop alter,对表结构的增删改
- TCL(事务控制语言):commit提交事务,rollback回滚事务(TCL中的T是Transaction)
- DCL(数据控制语言): grant授权、revoke撤销权限等
MySQL服务的启动和停止查看是否开启
- 计算机右击找到管理——服务和应用程序——服务——找到MySQL状态:正在运行停止:找到服务项——右击找到停止开启方法
- 管理员:命令提示符
net stop MySQL
关闭net start MySQL
开启
MySQL服务端的登陆与退出
- 在开始菜单找到MySQL Command Line Client输入Root用户的密码就行登出:CMD输入,:exit或者Ctrl+C弊端:只能登陆Root用户管理员:命令提示符MySQL -h localhost -P 3306 -u root -p
- Password解析:
MySQL -h 主机地址 -P 端口号 -u 用户名 -p密码
(-p和密码之间不能有空格)查看有哪些数据库
show databases
创建属于我们自己的数据库
create database yjw
使用yjw数据库
use yjw
查看当前使用的数据库中有哪些表
show tables
删除数据库
drop database yjw
查看表的结构
desc 表名
查看当前的数据库
select database()
查看mysql的版本号
select version()
查看MySQL服务端版本查看当前数据库版本“select version();” 在CMD中查看当前数据库的版本“mysql -version”或者“mysql -V”
退出数据库
设置当前时区
结束当前命令
查看创建表使用的SQL语句
show create table 表名
执行SQL语句
在CMD模式下使用:source 文件名.sql
简单的查询语句(DQL)
语法格式:select 字段名1,字段名2,字段名3,.... from 表名
提示:
- ①任何一条sql语句以“;”结尾
- ②sql语句不区分大小写,建议关键字大写,但是对数据库中的内容区分大小写
- ③字段可以参与数学运算
- ④标准sql语句中要求字符串使用单引号括起来,虽然mysql支持双引号,尽量别用
- ⑤单行注释:#注释文字或者—注释文字,多行注释:/注释文字/
将字段打印出来名称修改
select 字段名 as 别名 from 字段名;
select 字段名 as '单引号括起来的中文别名' from 字段名;
select 字段名 'as可以省略' from 字段名;
select 别名.字段名 from 表名 别名;
select * from 表名; //实际开发中不建议使用*,效率较低(使用减少数据的独立性,速度慢)
语法格式
```sql select 字段,字段… from 表名 where 条件;
select 字段名 from 表名 where 字段 = 值;
| **运算符** | **说明** |
| --- | --- |
| **=** | **等于** |
| **<>或!=** | **不等于** |
| **<** | **小于** |
| **<=** | **小于等于** |
| **>** | **大于** |
| **>=** | **大于等于** |
| **between … and ….** | **两个值之间(闭区间),等同于 >= and <=** |
| **is null(is not null)** | **为null(is not null 不为空)** |
| **and** | **并且** |
| **or** | **或者** |
| **in** | **包含,相当于多个or(在这几个值当中)(not in不在这个范围中)** |
| **not** | **not可以取非,主要用在is 或in中** |
| **like** | **like称为模糊查询,支持%或下划线匹配**<br />**%匹配任意个字符**<br />**下划线,一个下划线只匹配一个字符** |
**between and除了可以使用在数字方面之外,还可以使用在字符串方面(遵循左闭右开原则)**
```sql
select
字段名
from
表名
where
字段名 between 'A' and 'C';
可以用括号将想优先运算的表达式括起来即可
模糊查询like
在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_
%代表任意多个字符,代表任意1个字符(中文要两个_),和C语言一样的转义\
select ename from emp where ename like '表达式';
排序(升序、降序)
select
字段名
from
表名
order by
字段名 排序方式,
第二字段名 排序方式,
(这里也可以使用列名,但是如果和字段名不一样的话会让表没有用);
注: ①asc表示升序(默认),desc表示降序 ②越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段
分组函数(多行处理函数)
输入多行,最终输出的结果是1行
count 计数(如果使用的是count(*)可以直接统计含有null的条数) sum 求和 avg 平均值 max 最大值 min 最小值 记住: ①所有的分组函数都是对“某一组”数据进行操作的 ②自动忽略空(自动调用了ifnull函数) ③分组函数不能直接用在where子句中 ④可以组合起来使用(嵌套使用)
找出工资总和select sum(sal) from emp
找出最高工资select max(sal) from emp
找出最低工资select min(sal) from emp
找出平均工资select avg(sal) from emp
找出总人数
select count(*) from emp;
select count(ename) from emp;
单行处理函数
输入一行,输出一行select 字段名(常量) from 表名
只要有NULL参与的运算结果一定是NULL
ifnull() 空处理函数
ifnull(可能为NULL的数据,被当做什么处理)select ifnull(字段名,0) from 表名
group by 和 having
group by
:按照某个字段或者某些字段进行分组having
: having是对分组之后的数据进行再次过滤分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因,当一条sql语句没有group by的话,整张表的数据会自成一组 执行顺序:from——》where(优先)——》group by——》having(不推荐)——》select——》order by 当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段
查询结果去重
select distinct 字段名 from 表名;// distinct关键字去除重复记录
distinct
只能出现在所有字段的最前面,在最前面的话是所有字段联合去重
可以和分组函数联合使用
连接查询
在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果
连接查询的分类
根据语法出现的年代来划分的话,包括:
SQL92(一些老的DBA可能还在使用这种语法,DBA:DataBase Administrator,数据库管理员)
-
根据表的连接方式来划分,包括:
内连接
等值连接
- 非等值连接
-
外连接
左外连接(左连接)
- 右外连接(右连接)
全连接
在表的连接查询方面有一种现象被称为:笛卡尔乘积现象 笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积 避免了笛卡尔积现象,不会减少记录的匹配次数,次数还是原来的次数,只不过显示的是有效记录(SQL92语法)
select
表名.字段名,表名二.字段名
from
表名 别名,表名二 别名二
where
表名.别名 = 表名二.别名二;
(SQL99语法)
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno = d.deptno;
// inner可以省略的,带着inner目的是可读性好一些
SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了
自连接
-
内连接
假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接
-
外连接
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配
select
a.ename '员工', b.ename '领导'
from
emp a
left outer join
emp b
on
a.mgr = b.empno;
// outer可以省略的,带着outer目的是可读性好一些
子查询
select语句当中嵌套select语句,被嵌套的select语句是子查询
select
(select)
from
(select) 别名
where
(select);
union(可以将查询结果相加)
- 相加的条件是列数相同
limit
- limit是mysql特有的,其他数据库中没有,不通用(Oracle中有一个相同的机制,叫做rownum)
- limit取结果其中的部分数据
- limit startIndex(可省略,默认是0), length
- startIndex表示起始位置,从0开始,0表示第一条数据,length表示取几个
通用的标准分页sql
每页显示pageSize条记录: 第pageNo页:(pageNo - 1) * pageSize, pageSize pageSize是每页显示多少条记录 pageNo是显示第几页
语句顺序
书写顺序不能调换
select
5
from
1
where
2
group by
3
having
4
order by
6
limit
7
以上语句的执行顺序:
1.首先执行where 语句过滤原始数据
2.执行group by进行分组
3.执行having对分组数据进行操作
4.执行select选出数据
5.执行order by排序
6.执行limit分页
创建表
- 建表语句的语法格式:
常用数据类型create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
....
);
描述 | |
---|---|
Char(长度) | 定长字符串,存储空间大小固定,适合作为主键或外键 |
Varchar(长度) | 变长字符串,存储空间等于实际数据空间 |
double(有效数字位数,小数位) | 数值型 |
Float(有效数字位数,小数位) | 数值型 |
Int( 长度) | 整型 |
bigint(长度) | 长整型 |
Date | 日期型年月日 |
DateTime | 日期型年月日时分秒毫秒 |
time | 日期型时分秒 |
BLOB | Binary Large OBject(二进制大对象) |
CLOB | Character Large OBject(字符大对象) |
其它………………… |
char和varchar怎么选择
- 在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是采用char
- 当一个字段的数据长度不确定,例如:简介、姓名等都是采用varchar
表名在数据库当中一般建议以:t或者tbl开始
create table t_student(
no bigint,
name varchar(255),
sex char(1),
classno varchar(255),
birth char(10)
);
如果在字段名 类型后面加入default 值的话(如:sex char(1) default ‘m’,)可使数据默认值为default后面的值。
insert语句插入数据
语法格式:
insert into 表名(字段名1,字段名2,字段名3,....)
values(值1,值2,值3,....);
要求:字段的数量和值的数量相同,并且数据类型要对应相同
insert into 表名 values(值1,值2,值3,....);
// 字段可以省略不写,但是后面的value对数量和顺序都有要求
insert into 表名 values(值1,值2,值3,....),(值1,值2,值3,....);
//同时插入多条语句
表的复制
create table 表名 as select语句;
//将查询结果当做表创建出来
将查询结果插入到一张表中
insert into 新表名 select * from 表名;
修改数据
语法格式:
update 表名 set 字段名1=值1,字段名2=值2... where 条件;
注意:没有条件整张表数据全部更新
dele删除数据
语法格式:
delete from 表名 where 条件;
注意:没有条件全部删除
删除大表格
truncate table 表名; // 表被截断,不可回滚,永久丢失
注意:只能删除全部数据
drop语句删除表格
语法格式:
drop table if exists 表名;
- 如果存在这张表的话就删除
- 增删改查有一个术语:CRUD操作
- Create(增) Retrieve(检索) Update(修改) Delete(删除)
约束
- 在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性
常见的约束:
- 非空约束(not null):约束的字段不能为NULL,只有列级约束
唯一约束(unique):约束的字段不能重复
usercode varchar(255) unique,//【列级约束】
username varchar(255),
unique(usercode,username) //多个字段联合起来添加1个约束unique【表级约束】
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
id int,
age int primary key,
username varchar(255),
primary key(id)//【列级约束】
primary key(id,username)//【表级约束】
- 主键自增:后面添加auto_uncrement
id int primary key auto_increment
- 外键约束(foreign key):(简称FK)
- 外键字段:添加有外键约束的字段
- 外键值:外键字段中的每一个值
- 顺序要求:
- 删除数据的时候,先删除子表,再删除父表
- 添加数据的时候,先添加父表,在添加子表
- 创建表的时候,先创建父表,再创建子表
- 删除表的时候,先删除子表,在删除父表
外键可以为NULL,被引用的字段不一定是主键,但至少具有unique约束
create table t_class(
cno int,
primary key(cno)
);
create table t_student(
classno int,
foreign key(classno) references t_class(cno)
);
//references 表名(字段名)
- 检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束
字段名 类型 约束;
存储引擎
数据库存储引擎: 是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎,MySql的核心就是插件式存储引擎
查看存储引擎
SHOW ENGINES
由此可见, MySQL给用户提供了诸多的存储引擎,包括处理事务安全表的引擎和出来了非事物安全表的引擎
如果要想查看数据库默认使用哪个引擎,可以通过使用命令:
SHOW VARIABLES LIKE 'storage_engine';
在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎,Support列的值表示某种引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎,下面来看一下其中几种常用的引擎
InnoDB存储引擎(推荐)
InnoDB是事务型数据库的默认引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎
InnoDB主要特性
为MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎,InnoDB锁定在行级并且也在 SELECT语句中提供一个类似Oracle的非锁定读,这些功能增加了多用户部署和性能,在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
- InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池,InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件),这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中,InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
- InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
使用 InnoDB存储引擎 MySQL将在数据目录下创建一个名为 ibdata1的10MB大小的自动扩展数据文件,以及两个名为 ib_logfile0和 ib_logfile1的5MB大小的日志文件
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一,MyISAM拥有较高的插入、查询速度,但不支持事物
MyISAM主要特性:
被大文件系统和操作系统支持
- 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片,这要通过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成
- 每个MyISAM表默认索引数是64,这可以通过重新编译来改变,每个索引默认的列数是16
- 默认的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
- BLOB和TEXT列可以被索引
- NULL被允许在索引的列中,这个值占每个键的0~1个字节
- 所有数字键值以高字节优先被存储以允许一个更高的索引压缩
- 每个MyISAM类型的表都有一个AUTOINCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTOINCREMENT列将被刷新,所以说,MyISAM类型表的AUTOINCREMENT列更新比InnoDB类型的AUTOINCREMENT更快
- 可以把数据文件和索引文件放在不同目录
- 每个字符列可以有不同的字符集
- 有VARCHAR的表可以固定或动态记录长度
- VARCHAR和CHAR列可以多达64KB
使用MyISAM引擎创建数据库,将产生3个文件,文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
MEMORY主要特性:
MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的默认键长度
- MEMORY存储引擎执行HASH和BTREE缩影
- 可以在一个MEMORY表中有非唯一键值
- MEMORY表使用一个固定的记录长度格式
- MEMORY不支持BLOB或TEXT列
- MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
- MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
- MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行 DELETE FROM或 TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
存储引擎的选择
在实际工作中,选择一个合适的存储引擎是一个比较复杂的问题,每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好,但建议选择使用InnoDB
- InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制,如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势,如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)
- MyISAM: 插入数据快,空间和内存使用比较低,如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率,如果应用的完整性、并发性要求比 较低,也可以使用
- MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高,如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY,它对表的大小有要求,不能建立太大的表,所以,这类数据库只使用在相对较小的数据库表
- 注意:同一个数据库也可以使用多种存储引擎的表,如果一个表要求比较高的事务处理,可以选择InnoDB,这个数据库中可以将查询要求比较高的表选择MyISAM存储,如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎
事务
- 一个事务是一个完整的业务逻辑单元,不可再分
- 以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败
- 要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”
- 和事务相关的语句只有:DML语句,因为它们这三个语句都是和数据库表当中的“数据”相关的,事务的存在是为了保证数据的完整性,安全性
- 如果所有的业务都能使用1条DML语句搞定,不需要事务机制
但实际情况不是这样的,通常一个“事儿(事务【业务】)”需要多条DML语句共同联合完成
rollback;//回滚
commit;//提交
事务的特性
事务包括四大特性:ACID
- 原子性:事务是最小的工作单元,不可再分
- 一致性:事务必须保证多条DML语句同时成功或者同时失败
- 隔离性:事务A与事务B之间具有隔离
持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束
关于事务之间的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
- 第一级别:读未提交(read uncommitted)
- 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据
- 读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据
- 第二级别:读已提交(read committed)
- 对方事务提交之后的数据我方可以读取到
- 这种隔离级别解决了: 脏读现象没有了
- 读已提交存在的问题是:不可重复读
- 第三级别:可重复读(repeatable read)
- 这种隔离级别解决了:不可重复读问题
- 这种隔离级别存在的问题是:读取到的数据是幻象
- 第四级别:序列化读/串行化读(serializable)
- 解决了所有问题
- 效率低,需要事务排队
- oracle数据库默认的隔离级别是:读已提交
- mysql数据库默认的隔离级别是:可重复读
演示事务
- mysql事务默认情况下是自动提交的(什么是自动提交?只要执行任意一条DML语句则提交一次)
关闭自动提交
start transaction;
设置全局隔离级别
演示第1级别:读未提交
set global transaction isolation level read uncommitted;
演示第2级别:读已提交
set global transaction isolation level read committed;
演示第3级别:可重复读
set global transaction isolation level repeatable read;
演示第4级别:
set global transaction isolation level serializable;
查看事务的隔离级别
select @@global.tx.isolation;
索引
- 索引就相当于一本书的目录,通过目录可以快速的找到对应的资源,在数据库方面,查询一张表的时候有两种检索方式:
- 第一种方式:全表扫描
- 第二种方式:根据索引检索(效率很高)
- 索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护,是有维护成本的,比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护,原理:B Tree
- 主键和具有unique约束的字段自动会添加索引
- 根据主键查询效率较高,尽量根据主键检索
创建索引对象:
create index 索引名称 on 表名(字段名);
删除索引对象:
drop index 索引名称 on 表名;
查看sql语句的执行计划
- 创建索引
- 删除索引
索引的分类
单一索引:给单个字段添加索引<br /> 复合索引: 给多个字段联合起来添加1个索引<br /> 主键索引:主键上会自动添加索引<br /> 唯一索引:有unique约束的字段上会自动添加索引
索引的失效
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的
视图
站在不同的角度去看到数据(同一张表的数据,通过不同的角度去看待)
对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表),可以对视图进行CRUD操作
视图的作用
视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD
DBA命令
新建用户
说明:username:你将创建的用户名
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
授权
dbname=表示所有数据库
tbname=表示所有表
login ip=%表示任何ip
password为空,表示不需要密码即可登录
with grant option; 表示该用户还可以授权给其他用户
细粒度授权
首先以root用户进入mysql,然后键入命令:
如果希望该用户能够在任何机器上登陆mysql,则将localhost改为 “%” 。
粗粒度授权
我们测试用户一般使用该命令授权
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
privileges包括:
alter:修改数据库的表
create:创建新的数据库或表
delete:删除表数据
drop:删除数据库/表
index:创建/删除索引
insert:添加表数据
select:查询表数据
update:更新表数据
all:允许任何操作
usage:只允许登录
撤销权限
进入 mysql库中
修改密码
刷新权限
将数据库当中的数据导出
在windows的dos命令下执行(导出整个库):
导出指定数据库当中的指定表:
数据库设计三范式
设计表的依据,按照这个三范式设计的表不会出现数据冗余
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖
多对多,三张表,关系表,加外键
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖
一对多,两张表,多的表,加外键
在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度
一对一两种设计方案:外键唯一和主键共享
SQL Server安全性管理资料
背景知识:
对任何企业组织来说,数据的安全性最为重要。安全性主要是指允许那些具有相应的数据访问权限的用户能够登录到SQL Server,并访问数据以及对数据库对象实施各种权限范围内的操作,但是要拒绝所有的非授权用户的非法操作。因此安全性管理与用户管理是密不可分的。SQL Server 2000 提供了内置的安全性和数据保护,并且这种管理有效而又容易。
SQL Server 2000 的安全性管理是建立在认证(authentication)和访问许可(permission)两者机制上的。认证是用来确定登录SQL Server 的用户的登录账号和密码是否正确,以此来验证其是否具有连接SQL Server 的权限。但是通过认证阶段并不代表该用户能够访问SQL Server 中的数据,用户只有在获取访问数据库的权限之后,才能够对服务器上的数据库进行权限许可下的各种操作(主要是针对数据库对象,如表、视图、存储过程等),这种用户访问数据库权限的设置是通过用户账号来实现的,同时在SQL Server 中,角色作为用户组的代替物大大地简化了安全性管理。
数据库的安全管理主要是对数据库用户的合法性和操作权限的管理。数据库用户(在不至于引起混淆的情况下简称用户)是指具有合法身份的数据库使用者,角色是具有一定权限的用户组。SQL Server的用户或角色分为二级:一级为服务器级用户或角色;另一级为数据库级用户或角色。
SQL Server的安全性管理包括以下几个方面:数据库系统登录管理、数据库用户管理、数据库系统角色管理以及数据库访问权限的管理。
一、SQL Server 2000版本:
Microsoft公司于2000年9月布了SQL Server 2000,其中包括企业版(Enterprise Edition)、标准版(Standard Edition)、开发版(Developer Edition)、个人版(Personal Edition)四个版本。
它们的各自特点如下:
- 企业版提供了最多的功能特性和最佳的性能,适用于大规模的企业生产应用环境。
- 标准版的功能相对少一些,比较适合于中小规模的企业生产应用环境。
- 开发版拥有企业版中的绝大多数功能特性,但它只能用于开发和测试,而不能用在生产环境中。
- 个人版的功能和标准版类似,但在扩展性上有一定限制,如最多只能利用两个CPU、并发连接数超过5个时性能会有显著下降等。个人版通常适用于经常断开网络连接而又需要访问数据库的移动办公用户。另外,个人版不单独出售,而只能随企业版或标准版一同获得。
二、SQL Server 2000 的工具程序:
SQL Server 2000 的工具程序主要有服务管理器、企业管理器、查询分析器、事件探测器、客户端网络实用工具、服务器端网络实用工具、导入导出数据、联机帮助。
服务管理器、企业管理器、查询分析器、联机帮助的作用。
① 服务管理器:启动、停止、暂停SQL Server服务。在对SQL Server中的数据库和表进行任何操作之前,需要首先启动SQL Server服务。
② 企业管理器:有助于用户对SQL Server数据库进行管理和操作。
③ 查询分析器:帮助用户调试SQL 程序、测试查询及管理数据库。
④ 联机帮助:在使用SQL Server时可以随时参考的辅助说明。三、SQL Server的登录认证模式:
SQL Server 2000 的提供了两种确认用户登录认证的模式:Windows认证模式和混合认证模式。
Windows认证模式是信任方式,指的是登录数据库实例时使用登录Windows时的账户,SQL Server数据库实例通过回叫Windows的安全性检验来确认该账户是否为合法账户。(因为网络操作系统本身具备管理登录,在该模式下,用户只有通过Windows的认证就可以连接到SQL Server。)
混合认证模式是非信任方式,指的是登录数据库实例时既可以使用Windows账户,也可以使用SQL Server账户(Windows认证和SQL Server认证这两种认证模式都可用)。使用SQL Server账户时,由用户提供登录名和密码,由SQL Server数据库实例进行登录名和密码的验证。注:该方式常用于系统开发中,因为客户机常常与服务器不是同一台计算机,必须使用该方式登录。
设置SQL Server的登录认证模式:
可用使用企业管理器来设置SQL Server的登录认证模式。在企业管理器中,展开SQL Server服务组,右键单击需要设置的SQL Server服务,从弹出的菜单中选择“属性”命令,如下图所示。
弹出“SQL Server属性(配置)”对话框,选择“安全性”选项卡,选择“SQL Server和Windows”或“仅Windows”单选按钮来设置登录认证模式。
注意:设置改变后,用户必须停止并重新启动SQL Server服务,新设置才能生效。
四、验证安装和启动数据库服务器
验证安装是否成功,可以通过是否能启动SQL Server服务来判断。
启动SQL Server服务的方法:
“开始”——->“程序”——-> “SQL Server” ——-> “服务管理器”
说明安装成 功 |
---|
五、企业管理器的使用
在 “开始”——->“程序”——-> “Microsoft SQL Server” ——-> “企业管理器”。
样本数据库 |
---|
系统数据库 |
---|
六、管理登录账号
(1)登录账号
登录账号也称为登录用户或登录名,是服务器级用户访问数据库系统的标识。为了访问SQL Server系统,用户必须提供正确的登录账号,这些登录账号既可以是Windows登录账号,也可以是SQL Server登录账号,但它必须是符合标识符规则的惟一名字。登录账号的信息是系统信息,存储在master数据库的sysxlogins系统表中,用户如需要有关登录账号的信息可以到该表中查询。
SQL Server 2000有一个默认的登录账号sa (SystemAdministrator),sa是SQL Server的一个超级账号,在SQL Server系统中它拥有全部权限,可以执行所有的操作。
(2)查看登录账号
使用企业管理器可以创建、查看和管理登录账号。“登录账号”存放在SQL服务器的安全性文件夹中。当进入企业管理器,打开指定的SQL服务器组和SQL服务器,并选择【安全性】文件夹的系列操作后,就会出现如图9-2所示的屏幕窗口。通过该窗口可以看出安全性文件夹包括4个文件夹:登录、服务器角色、连接服务器和远程服务器。单击【登录】可以看到当前数据库服务器的合法登录用户的一些信息。
(3)创建一个登录账号
创建一个登录账号的操作步骤为:右击【登录】文件夹,在弹出的菜单中选择【新建登录】选项后,会出现图9-3所示新建登录对话框界面,回答相应信息即可。也可以通过此界面设定该登录用户的服务器角色和要访问的数据库,这样该登录账号同时也作为数据库用户。
(4)编辑或删除登录账号
单击【登录】文件夹,在出现的显示登录账号的窗口中,用鼠标右击需要操作的登录号:选择【属性】便可对该用户已设定内容进行重新编辑;选择【删除】便可删除该登录用户。
进行上述操作需要对当前服务器拥有管理登录(Security Administrators)及其以上的权限。
图9-2 安全性文件夹的屏幕界面图9-3 新建登录对话框
七、数据库用户管理
(1)用户账号
用户账号也称为用户名,或简称为用户。他是数据库级用户,即是某个数据库的访问标识。数据库用户用来指定哪一个人可以访问哪一个数据库。在SQL Server的数据库中,对象的全部权限均由用户账号控制。
在数据库中,用户账号和登录账号是两个不同的概念。一个合法的登录账号只表明该账号通过了Windows认证或SQL Server认证,但不能表明其可以对数据库数据和数据对象进行某种操作,只有当他同时拥有了用户账号后,才能够访问数据库。用户账号可以与登录账号相同也可以不想同。数据库用户必须是登录用户。登录用户只有成为数据库用户(或数据库角色)后才能访问数据库。用户账号与具体的数据库有关。例如,MyDb数据库中的用户账号use1不同于STUDENTES数据库中的用户账号use1。
每个数据库的用户信息都存放在系统表sysusers中,通过查看该表可以看到当前数据库所有用户的情况。在该表中每一行数据表示一个SQL Server用户或SQL Server角色信息。创建数据库的用户称为数据库所有者(dbo),他具有这个数据库的所有权限。创建数据库对象的用户称为数据库对象的所有者(dbo),他具有该对象的所有权限。在每一个SQL Server 2000数据库中,至少有一个名称为dbo用户。系统管理员sa是他所管理系统的任何数据库的dbo用户。
(2)查看用户账号
使用企业管理器可以创建、查看和管理数据库用户。每个数据库中都有“用户”文件夹。当进入企业管理器,打开指定的SQL服务器组和SQL服务器,并打开【数据库】文件夹,选定并打开要操作的数据库后,单击【用户】文件夹就会出现如图9-4所示的用户信息窗口。通过该窗口可以看到当前数据库合法用户的一些信息。
图9-4 查看用户信息窗口
(3)创建新的数据库用户
创建新的数据库用户有两种方法:
一种方法是在创建登录用户时,指定他作为数据库用户的身份。例如,在图9-3新建登录对话框中,输入登录名称(如user1),单击【数据库访问】选项卡,在【指定此登录可以访问的数据库[S]】区域的【许可】栏目下指定访问数据库(如MyDb),如图9-5所示,登录用户user1同时也成为数据库MyDb的用户。
另一种方法是单独创建数据库用户,这种方法适于在创建登录账号时没有创建数据库用户的情况,操作步骤如下:右击【用户】文件夹,在弹出的菜单中选择【新建数据库用户】命令后,会出现图9-6所示新建用户对话框界面,在【登录名】下拉框中选择预创建用户对应的登录名,然后在【用户名】的文本框中键入用户名即可。如图9-6所示。通过此界面也可以设定该数据库用户的权限和角色的成员。
图9-5 创建登录时指定登录用户同时作为数据库用户界面
图9-6 单独创建数据库用户对话框
(4)编辑或删除数据库用户账号
单击【用户】文件夹,在出现的显示用户账号的窗口中,右击需要操作的用户账号,选择【属性】命令,出现该用户的角色和权限窗口,可对该用户已设定内容进行重新编辑;选择【删除】便可删除该数据库用户。
进行上述操作需要对当前数据库拥有用户管理(db_accessadmin)及其以上的权限。
八、数据库系统角色管理
SQL Server 2000服务器和数据库都有自己固有角色。固有角色是指SQL Server 2000预定义好的系统角色。用户不能修改这些角色的任何属性,也不能创建新的服务器固有角色和数据库固有角色。
数据库角色是在数据库的安全级别上创建,一个数据库角色只在其所在的数据库中有效,对其他数据库无效。在数据库中,除了有固有的数据库角色外,还可以自定义数据库角色,同时根据需要,可以为数据库角色添加成员或删除自定义角色。
在SQL Server 2000中可以把某些用户设置成某一角色,这些用户称为该角色的成员。当对该角色进行权限设置时,其成员自动继承该角色的权限。这样,只要对角色进行权限管理就可以实现对属于该角色的所有成员的权限管理,大大减少了工作量。
SQL Server中有两种角色,即服务器角色和数据库角色。
(1)服务器角色
一台计算机可以承担多个 SQL Server服务器的管理任务。固定服务器角色是对服务器级用户即登录账号而言的。它是指在登录时授予该登录账号对当前服务器范围内的权限。这类角色可以在服务器上进行相应的管理操作,完全独立于某个具体的数据库。
固定服务器角色的信息存储在master数据库的sysxlogins系统表中。SQL Server 2000提供了8种固定服务器角色,如图9-7所示。
图9-7固定服务器角色
SQL Server共有8种预定义的服务器角色,各角色的具体含义如表1所示。表1服务器角色
服务器角色 | 角 色 描 述 |
---|---|
Sysadmin(系统管理员) | 可以在SQL Server中做任何事情 |
Serveradmin(服务器管理员) | 设置SQL Server服务器范围内的配置选项,可以关闭服务器 |
Setupadmin(安装管理员) | 可以管理扩展的存储过程 |
Securityadmin(安全管理员) | 管理数据库登录 |
Processadmin(进程管理员) | 管理运行在SQL Server中的进程 |
Dbcreator(数据库创建者) | 可以创建和更改数据库 |
Diskadmin(磁盘管理员) | 管理磁盘文件 |
Bulkadmin(批量管理员) | 可以执行大容量数据插入操作 |
下面介绍如何使用企业管理器来管理服务器角色。
可以使用企业管理器将登录账号添加到某一指定的固定服务器角色作为其成员。步骤如下:登录服务器后,展开【安全性】文件夹,单击【服务器角色】文件夹,则会出现图9-7所示的固定服务器角色窗口,右击某一角色,在弹出的菜单中选择【属性】命令,可以查看该角色的权限,并可以添加某些登录账号作为该角色的成员,也可以将某一登录账号从该角色的成员中删除。
注意:
(1)固定服务器角色不能被删除、修改、增加;
(2)固定服务器角色的任何成员都可以将其他的登录账号增加到该服务器角色中。
(2)数据库角色
在一个服务器上可以创建多个数据库。数据库角色对应于单个数据库。数据库的角色分为固定数据库角色和用户定义的数据库角色。
固定数据库角色是指SQL Server 2000为每个数据库提供的固定角色。SQL Server 2000允许用户自己定义数据库角色,称为用户定义的数据库角色。
(1)固定数据库角色
固定数据库角色的信息存储在sysuers系统表中。SQL Server 2000提供了10种固定数据库角色,如表9-3所示。
表9-3固定数据库角色
角色 | 描述 | |
---|---|---|
public | 维护默认的许可 | |
db_ owner | 执行数据库中的任何操作 | |
db_accessadmin | 可以增加或删除数据库用户、组和角色 | |
db_addladmin | 增加、修改或删除数据库对象 | |
db_securityadmin | 执行语句和对象权限管理 | |
db_backupoperator | 备份和恢复数据库 | |
db_datareader | 检索任意表中的数据 | |
db_datawriter | 增加、修改和删除所有表中的数据 | |
db_denydatareader | 不能检索任意一个表中数据 | |
db_denydatawriter | 不能修改任意一个表中的数据 |
可以使用企业管理器查看固定数据库角色,还可以将某些数据库用户添加到固定数据库角色中,使数据库用户成为该角色的成员。也可以将固定数据库角色的成员删除。
将用户添加到某一数据库角色的步骤为:打开指定的数据库,单击【角色】文件夹,右击某个固定数据库角色,在出现的菜单中选择【属性】命令,就会出现图9-8所示的数据库角色属性对话框,单击【添加】按钮,则会出现该角色的非成员用户,按提示信息操作可以将他们添加到该角色中;选中某一用户后,单击【删除】按钮可以将此用户从该角色中删除。
图9-8 数据库角色属性对话框
注意:
●SQL Server 2000提供的10种固定数据库角色不能被删除和修改。
●固定数据库角色的成员可以增加其他用户到该角色中。
(2)用户定义的数据库角色
在许多情况下,固定数据库角色不能满足要求,需要用户自定义数据库新角色。
使用企业管理器创建数据库角色的步骤为:在企业管理器中打开要操作的数据库文件夹,右击【角色】文件夹,并在弹出的菜单中选择【新建数据库角色】命令,则出现新建数据库角色对话框如图9-9所示,按提示回答角色名称等相应信息后,单击【确定】按钮即可。
在新建数据库角色对话框中可完成3种操作:在名称栏中输入新角色名;在用户栏中添加或删除角色中的用户;确定数据库角色类型。
用户定义的数据库角色类型有两种:标准角色(Standard Role)和应用程序角色(ApplicationRole)。标准角色用于正常的用户管理,它可以包括成员。而应用程序角色是一种特殊角色,需要指定口令,是一种安全机制。
图9-9 新增数据库角色对话框
图9-10 数据库角色权限设置对话框
对用户定义的数据库角色,可以设置或修改其权限。使用企业管理器进行操作的步骤为:打开操作数据库,选中用户定义的数据库角色,右击此角色在弹出的菜单中选择【属性】命令,然后单击【权限】按钮,则会出现当前数据库的全部数据对象以及该角色的权限标记(若对角色设置过权限,也可以仅列出该角色具有权限的数据对象)。如图9-10所示。单击数据库角色权限设置对话框中数据对象访问权限的选择方格有三种状况:
√:授予权限。表示授予当前角色对指定的数据对象的该项操作权限。
×:禁止权限。表示禁止当前角色对指定的数据对象的该项操作权限。
空:撤消权限。表示撤销当前角色对指定的数据对象的该项操作权限。
使用企业管理器也可以删除用户定义的数据库角色。步骤为:打开操作数据库,选中用户定义的数据库角色,右击此角色在弹出的菜单中选择【删除】命令即可。
九、SQL Server权限管理
(1) 权限的种类
SQL Server 2000使用权限来加强系统的安全性,通常权限可以分为三种类型:对象权限、语句权限和隐含权限。
(1) 对象权限
对象权限是用于控制用户对数据库对象执行某些操作的权限。数据库对象通常包括表、视图、存储过程。
对象权限是针对数据库对象设置的,它由数据库对象所有者授予、禁止或撤消。对象权限适用的数据库对象和Transact-SQL语句在表9-4中列出。
表9-4对象权限适用的对象和语句
Transact-SQL | 数据库对象 | |
---|---|---|
SELECT(查询) | 表、视图、表和视图中的列 | |
UPDATE(修改) | 表、视图、表的列 | |
INSERT(插入) | 表、视图 | |
DELETE(删除) | 表、视图 | |
EXECUTE(调用过程) | 存储过程 | |
DRI(声明参照完整性) | 表、表中的列 |
(2) 语句权限
语句权限是用于控制数据库操作或创建数据库中的对象操作的权限。语句权限用于语句本身,它只能由SA或dbo授予、禁止或撤消。语句权限的授予对象一般为数据库角色或数据库用户。语句权限适用的 Transact-SQL语句和功能如表9-5所示。
表9-5 语句权限适用的语句和权限说明
Transact-SQL语句 | 权限说明 |
---|---|
CREATE DATABASE | 创建数据库,只能由SA授予SQL服务器用户或角色 |
CREATE DEFAULT | 创建缺省 |
CREATE PROCEDURE | 创建存储过程 |
CREATE RULE | 创建规则 |
CREATE TABLE | 创建表 |
CREATE VIEW | 创建视图 |
BACKUP DATABASE | 备份数据库 |
BACKUP LOG | 备份日志文件 |
(3) 隐含权限
隐含权限指系统预定义而不需要授权就有的权限,包括固定服务器角色成员、固定数据库角色成员、数据库所有者(dbo)和数据库对象所有者(dbo)所拥有的权限。
例如,sysadmin固定服务器角色成员可以在服务器范围内做任何操作,dbo可以对数据库做任何操作,dbo可以对其拥有的数据库对象做任何操作,对他不需要明确的赋予权限。
(2) 权限的管理
对象权限的管理可以通过两种方法实现:一种是通过对象管理它的用户及操作权限,另一种是通过用户管理对应的数据库对象及操作权限。具体使用哪种方法要视管理的方便性来决定。
(1)通过对象授予、撒消或禁止对象权限
如果一次要为多个用户(角色)授予、撤消或禁止对某一个数据库对象的权限时,应采用通过对象的方法实现。在SQL Server的企业管理器中,实现对象权限管理的操作步骤如下:
1)展开企业管理器窗口,打开【数据库】文件夹,展开要操作的数据库(如MyDb),右击指定的对象(如readers表)。
2)在弹出的菜单中,选择【所有任务】,在弹出的子菜单中选择【管理权限】命令,此时会出现一个对象权限对话框,如图9-11所示。
3)对话框的上部,有两个单选框如图9-11所示,可以根据需要选择一个。一般选择【列出全部用户】→【用户定义的数据库角色/public】。
4)对话框的下面是有关数据库用户和角色所对应的权限表。这些权限均以复选框的形式表示。复选框有三种状态:“√”(授予权限)、“×”(禁止权限)、空(撤消权限)。在表中可以对各用户或角色的各种对象操作权限(SELECT、INSERT、UPDATE、DELETE、EXEC和DRI)进行授予、禁止或撤消,单击复选框可改变其状态。
5)完成后单击【确定】按钮。
图9-11 数据库对象权限对话框 图9—12 数据库角色权限属性对话框
(2)通过用户或角色授予、撤消或禁止对象权限
如果要为一个用户或角色同时授予、撤消或者禁止多个数据库对象的使用权限,则可以通过用户或角色的方法进行。例如要对“MyDb”数据库中的“数据输入”角色进行授权操作,在企业管理器中,通过用户或角色授权(或收权)的操作步骤如下:
1)扩展开SQL服务器和【数据库】文件夹,单击数据库【MyDb】,单击【用户】或【角色】。本例单击【角色】。在窗口中找到要选择的用户或角色,本例为【数据输入】角色,右击该角色,在弹出菜单中选择【属性】命令后,出现如图9-12所示数据库角色属性对话框。
2)在数据库角色属性对话框中,单击【 权限】按钮,会出现如图9-13所示的数据库角色权限属性对话框。
图9-13 数据库角色权限属性对话框
4)在对话框的权限列表中,对每个对象进行授予、撤消或禁止权限操作。在权限表中,权限SELECT、INSERT、UPDATE等安排在列中,每个对象的操作权用一行表示。在相应的复选框上,如果为“√”则为授权,为“×”则为禁止权限,如果为空白则为撤消权限。单击复选框可改变其状态。
5)完成后,单击【确定】按钮。返回数据库角色属性对话框后,再单击【确定】按钮。
(3) 语句权限的管理
SQL Server的企业管理器中还提供了管理语句权限的方法,其操作的具体步骤如下:
1)展开SQL服务器和【数据库】文件夹,右击要操作的数据库文件夹,如【MyDb】数据库,并在弹出菜单中选择【属性】命令,会出现数据库属性对话框。
2)在数据库属性对话框中,选择【权限】选项卡,出现数据库用户及角色的语句权限对话框,如图9-14所示。
图9-14 数据库用户和角色的语句权限对话框
在对话框的列表栏中,单击表中的各复选框可分别对各用户或角色授予、撤消或禁止数据库的语句操作权限。复选框内的“√”表示授予权限,“×”表示禁止权限,空白表示撤消权限。
3)完成后单击【确定】按钮。
(4) 使用Transact-SQL语句管理权限
SQL Server 2000的安全性管理,不仅可以通过SQL Server的企业管理器的相应操作实现,还可以在查询分析器中通过Transact-SQL语句实现。这里只介绍用Transact-SQL语句实现权限管理。
(1)授予权限语句-GRANT
1) 语句授权
【例9.9】 语句授权:将创建数据库、创建表的权限授予用户user1和user2。
——将MyDb数据库设置为当前数据库——
USE MyDb
GRANT CREATE TABLE TO user2
通过查看数据库MyDb【属性】的【权限】项,可以看到用户user2拥有创建表的语句权限。
2) 对象授权
注意:SQL Server 与标准SQL的不同是省去了对象类型,直接写对象名称即可。
【例9.10】 对象授权:授予角色public对表readers的select权限,授予用户user1对表readers的insert和delete的权限。
GRANT SELECT ON readers TO public
GRANT INSERT,DELETE ON readers TO user1
通过查看角色public和用户user2的属性,可以看到他们已拥有对数据对象 readers的相应权限。
【例9.11】将对表readertype的属性“限借阅数量”和“借阅期限”的修改权限授予user2。
GRANT UPDATE(限借阅数量, 借阅期限) ON readertype TO user2
(2)禁止权限语句-DENY
1)禁止语句权限
【例9.12】禁止用户user2的CREATE TABLE 语句权限。
DENY CREATE TABLE TO user2
通过查看数据库MyDb【属性】的【权限】项,可以看到该用户对数据库的创建表的语句权限被禁止。
2)禁止对象权限
【例9.13】禁止用户user2对表readers的DELETE权限。
DENY DELETE ON readers TO user2
通过查看用户user2的属性,可以看到该用户对数据对象 readers的DELETE的权限被禁止。
可以使用DENY语句限制用户或角色的某些权限。这样不禁删除了以前授予用户或角色的某些权限,而且还禁止这些用户或角色从其他角色继承禁止的权限。
(3)撤消权限语句-REVOKE
1) 1)撤消语句权限
【例9.14】撤消用户user2的CREATE TABLE 语句权限。
REVOKE CREATE TABLE TO user2
通过查看数据库MyDb【属性】的【权限】项,可以看到用户user2创建表的权限被撤消。
2)撤销对象权限
【例9.15】撤消用户user2对表readers的DELETE权限。
REVOKE DELETE ON readers TO user2
通过查看用户user2的属性,可以看到该用户对数据对象 readers的DELETE的权限被撤消。
注意:撤消权限的作用类似于禁止权限,它们都可以删除用户或角色的指定权限。但是撤消权限仅仅删除用户或角色拥有的某些权限,并不禁止用户或角色通过其它方式继承已被撤消的权限。
使用系统存储过程 sp_helprotect可以查看当前数据库中指定数据对象或语句上的权限信息。
【例9.16】以下批的执行结果表明,用户user1在books上的DELETE权限被禁止后,将其加入拥有books上的DELETE权限的角色group中后,被禁止的权限DELETE不能从group中继承。结果如表9-6所示。
—对user1授权—
GRANT INSERT,DELETE ON books TO user1
—查看表books上的权限情况—
EXEC sp_helprotect ‘books’
—禁止user1对表books的DELETE权限—
DENY DELETE ON books TO user1
—查看表books上的权限情况—
EXEC sp_helprotect ‘books’
—授予角色group权限—
GRANT INSERT,DELETE,UPDATE ON books TO group1
—将user1添加到角色group—
EXEC sp_addrolemember ‘group1’,’user1’
—查看表books上的权限情况—
EXEC sp_helprotect ‘books’
Go
表9-6 被禁止的权限不能通过角色继承