有时让用户看到整个基本表是不合适的,出于安全考虑,可能需要向用户隐藏特定的数据。如在instructor关系中隐藏工资值:
select ID,name,dept_name from instructor;
创建更符合特定用户直觉的个人化的关系集合,如学生成绩表由学生关系和课程关系连接得到。
CREATE VIEW <视图名> [(<列名> [, <列名>]…)] AS <子查询>
语句的格式:
DROP VIEW <视图名>;
创建一个视图,它包含除salary外的教师属性
create view faculty as select ID, name, dept_name from instructor;
利用show tables;
即可查询
create view physics_fall_2017 as select course.course_id, sec_id, building, room_number from course, section where course.course_id = section.course_id and course.dept_name = ’Physics’ and section.semester = ’Fall’ and section.year = 2017;
创建一个视图,它列出2017年秋季学期Physics系在Watson建筑所开设的课程信息
create view physics_fall_2017_watson as select course_id, room_number from physics_fall_2017 where building= 'Watson';
等价于
create view physics_fall_2017_watson as select course_id, room_number from (select course.course_id, building, room_number from course, section where course.course_id = section.course_id and course.dept_name = 'Physics' and section.semester = 'Fall' and section.year = 2017) where building= 'Watson';
创建一个视图,它给出每个系中教师的工资总和
create view departments_total_salary(dept_name, total_salary) as select dept_name, sum(salary) from instructor group by dept_name
drop view faculty;
drop view physics_fall_2017;
drop view physics_fall_2017 cascade;
cascade代表删除该视图的同时删除其他和该视图有关系的视图
使用视图physics_fall_2017,找到所有于2017年秋季学期在Watson大楼开设的physics课程
select course_id from physics_fall_2017 where building= 'Watson';
视图消解转换后的查询语句
select course.course_id from course, section where course.course_id = section.course_id and course.dept_name = 'Physics' and section.semester = 'Fall' and section.year = 2017 and building= 'Watson';
特定数据库系统(如: Oracle)允许存储视图,即物化视图。
需要使用到物化视图的情况:
物化视图的维护
视图的更新、插入或删除可能带来严重的后果
向视图faculty中插入新教师的记录
insert into faculty values ('30765', 'Green', 'Music');
考虑视图:大学里每个教师的ID,name和建筑名
create view instructor_info as select ID,name,building from instructor,department where instructor.dept_name = department.dept_name;
假设没有ID号为69987的教师,也没有位于Taylor大楼的系,向视图instructor_info中插入记录
insert into instructor_info values ('69987', 'White', 'Taylor');
我们这里进行修改的是拥有两个base table 的视图,所以不能更改
方法一: create user用于创建用户,并在权限表中创建一条记录。
create user user_name [identified by [password]]
方法二:向权限表中插入一条记录
insert into mysql.user (host, user, password) values (host_name, user_name, password);
创建一个新用户,用户名为Amit,密码为123
create user Amit identified by '123'; insert into mysql.user (host, user, password) values ('%', 'Amit', password('123'));
drop user user_name;
delete from mysql.user where user = user_name;
select、 insert、 update和delete权限, all privileges是所有权限的简写
基本格式 grant<权限列表> on<关系名或视图名> to<用户或角色列表>;
授予数据库用户Amit和Sam在department关系上的select权限
grant select on department to Amit, Sam;
授予用户Amit和Sam在department关系的budget属性上的更新权限
grant update (budget) on department to Amit, Sam;
update和insert权限既可以在关系的所有属性上授予,又可以只在
某些属性上授予。
如果省略属性列表,则在关系的所有属性上授权。
revoke语句收回权限
语句格式: revoke <权限列表> on <关系名或视图名> from <用户或角色列表>;
收回用户Amit和Sam在department关系上的select权限
revoke select on department from Amit, Sam;
收回用户Amit和Sam在department关系的budget属性上的更新权限
revoke update (budget) on department from Amit, Sam;
创建新用户“Amit”和“Sam "
这里我在IDEA里登录Amit 的用户,是已经输入了密码123的
考虑一位工作人员Amit ,他需要知道一个给定系(比如Biology系)里所有员工的工资,可以创建一个视图,并将视图上的查询权限授予该工作人员
create view Bio_instructor as (select * from instructor where dept_name = ’Biology’); grant select on Bio_instructor to Amit;
创建视图的用户对视图的权限依赖定义视图的关系的权限
create role instructor; grant select on takes to instructor;
角色可以授予给用户,也可以授予给其他角色
create role dean; grant dean to Amit; grant instructor to dean; grant dean to Sam;
一个用户或角色的权限包括:
默认方式下,被授予权限的用户/角色无权把得到的权限再授予给另外的用户/角色。
授予Amit在department上的select权限,并且允许Amit将该权限授予给其他用户
grant select on department to Amit with grant option;
一个对象(关系/视图/角色)的创建者拥有该对象上的所有权限,包括给其他用户授权的权限授予给其他用户
grant select on department to Amit with grant option;
一个对象(关系/视图/角色)的创建者拥有该对象上的所有权限,包括给其他用户授权的权限。
考虑teaching数据库中teaches关系上update权限的授予,U1,….,U5是用户, DBA代表数据库管理员。
级联收回:从一个用户/角色那里收回权限可能导致其他用
户/角色也失去该权限,用cascade关键字实现级联收回。
关键字restrict可以防止级联收回。
大多数的数据库系统中,级联收回是默认行为。
收回用户Amit和Sam在department关系上的select权限,并且不做级联收回
revoke select on department from Amit, Sam restrict;
收回用户U1在teaches关系上的update权限
revoke update on teaches from U1;
数据库的权限
权限 | 权限级别 | 权限说明 |
CREATE | 数据库、表或索引 | 创建数据库、表或索引权限 |
DROP | 数据库或表 | 删除数据库或表权限 |
GRANT OPTION | 数据库、表或保存 | 授予权限选项 |
REFERENCES | 数据库或表 |
表和视图的权限
权限 | 权限级别 | 权限说明 |
ALTER | 表 | 更改表,比如添加字段、索引等 |
DELETE | 表 | 删除数据权限 |
INDEX | 表 | 索引权限 |
INSERT | 表 | 插入权限 |
SELECT | 表或视图 | 查询权限 |
UPDATE | 表 | 更新权限 |
CREATE VIEW | 视图 | 创建视图权限 |
存储过程和文件访问的权限
权限 | 权限级别 | 权限说明 |
ALTER ROUTINE | 存储过程 | 更改存储过程权限 |
CREATE ROUTINE | 存储过程 | 创建存储过程权限 |
EXCUTE | 存储过程 | 执行存储过程权限 |
FILE | 服务器主机上的文件访问 | 文件访问权限 |
服务器管理的权限
权限 | 权限级别 | 权限说明 |
CREARE TEMPORARY | 服务器管理 | 创建临时表权限 |
LOCK TABLES | 服务器管理 | 锁表权限 |
CREATE USER | 服务器管理 | 创建用户权限 |
PROCESS | 服务器管理 | 查看进程权限 |
RELOAD | 服务器管理 | 执行flush、 reload等 |
SHOW DATABASES | 服务器管理 | 查看数据库权限 |
SHUTDOWN | 服务器管理 | 关闭数据库权限 |
SUPER | 服务器管理 | 执行kill线程权限 |
grant all privileges on *.* to dba with grant option;