[SQL]视图和权限

news2024/11/24 22:28:30

有时让用户看到整个基本表是不合适的,出于安全考虑,可能需要向用户隐藏特定的数据。如在instructor关系中隐藏工资值:

select ID,name,dept_name
from instructor;

创建更符合特定用户直觉的个人化的关系集合,如学生成绩表由学生关系和课程关系连接得到。

  • 视图是从一个或几个基本表导出的表
  • 视图是一个虚关系,数据库中只存放视图的定义而不存放视图对应的数据,其数据存放在导出视图的基本表中,在使用视图时通过执行查询计算出虚关系。
  • 在概念上与基本表等同。视图一经定义,就可以和基本表一样被查询、被删除,也可以在视图上再定义视图。

视图的作用

  1. 视图使用户能以多种角度看待同一数据
  2. 视图能够对机密数据提供安全保护
  3. 视图能够简化用户的操作
  4. 适当的利用视图可以更清晰地表达查询

视图定义

  • 语句格式
CREATE VIEW <视图名> [(<列名> [, <列名>]…)]
	AS <子查询>
  • 组成视图的属性列名:全部省略或全部指定
    • 如果省略了视图的各个属性列名,则隐含该视图由子查询SELECT子句目标列中的诸字段组成
    • 三种情况必须指定所有列名:目标列是聚集函数或列表达式;多表连接时出现同名列作为视图的属性;需要在视图中为某个列更改名字
  • 子查询可以是任何合法地查询表达式

  • RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
  • 在对视图查询时,按视图的定义从基本表中将数据查出。

删除视图

语句的格式:

DROP VIEW <视图名>;
  • 该语句从数据字典中删除指定的视图定义
  • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
  • 删除基本表时,由该基本表导出的所有视图定义都必须显式地使用DROP VIEW语句删除.

视图定义示例

创建一个视图,它包含除salary外的教师属性

create view faculty as
select ID, name, dept_name
from instructor;

利用show tables;即可查询

  • 创建一个视图,它列出Physics系在2017年秋季学期所开设的所有课程段,以及每个课程段在哪栋建筑的哪个房间授课的信息
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

视图删除示例

  • 删除视图faculty
    • drop view faculty;
  • 删除视图physics_fall_2017
    • drop view physics_fall_2017;
    • drop view physics_fall_2017 cascade;

cascade代表删除该视图的同时删除其他和该视图有关系的视图

SQL查询中使用视图

  • 用户角度:查询视图与查询基本表相同
  • RDBMS实现视图查询的方法:视图消解法
    • 进行有效性检查
    • 转换成等价的对基本表的查询
    • 执行修正后的查询

使用视图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)允许存储视图,即物化视图。

需要使用到物化视图的情况:

  1. 频繁使用的视图
  2. 需要快速响应基于大关系上聚集计算的特定查询

物化视图的维护

  1. 构成视图定义的任何关系更新时,可以马上进行视图维护
  2. 在视图被访问时才执行视图维护
  3. 周期性的更新物化视图.

视图更新

视图的更新、插入或删除可能带来严重的后果

向视图faculty中插入新教师的记录

insert into faculty
values ('30765', 'Green', 'Music');

  • 处理方式
    • 拒绝插入,并向用户返回一个错误信息
    • 向instructor关系插入元组('30765','Green','Music',null)

考虑视图:大学里每个教师的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');

  • 唯一可能的处理方式:向instructor中插入元组
    • (’69987’, ’White’, null, null),并向department中插入元组(null, ’Taylor’, null);
  • 但是,视图instructor_info中仍然不包含元组(’69987’, ’White’, ’Taylor’)。

我们这里进行修改的是拥有两个base table 的视图,所以不能更改

SQL数据控制

创建用户

方法一: 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删除用户
drop user user_name;
  • 方法二:从权限表中删除给定用户名的记录
delete from mysql.user
where user = user_name;

数据操作权限

select、 insert、 update和delete权限, all privileges是所有权限的简写

  • Select权限用于读取关系中的元组
  • Insert权限允许用户往关系中插入元组
  • Update权限允许用户修改关系中的任意元组
  • Delete权限允许用户从关系中删除元组。
  • 一个创建了新关系的用户将自动被授予该关系上的所有权限
  • 当用户提交查询或更新时,基于该用户曾获得过的权限, SQL执行检查此查询或更新是否是授权过的。如果查询或更新没有经过授权,那么将被拒绝执行。

权限的授予与收回(grant)

  • grant 语句用来授予权限
基本格式
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语句收回权限

语句格式:
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;

创建视图的用户对视图的权限依赖定义视图的关系的权限

  • 如果一个创建视图的用户在用来定义视图的关系上没有update权限,那么该用户不能得到视图上的update权限。
  • 在Bio_instructor视图例子中,视图的创建者必须在instructor关系上具有select权限。

角色

  • 角色并不对应于某个具体的用户,而是对于一类具有共同特征的用户的总称。
  • 可以为一组具有相同权限的用户创建一个角色,以简化授权的过程。

  • 任何可以授予给用户的权限都可以授予角色
  • 给用户授予角色类似于给用户授权
create role instructor;
grant select on takes to instructor;

角色可以授予给用户,也可以授予给其他角色

create role dean;
grant dean to Amit;
grant instructor to dean;
grant dean to Sam;

一个用户或角色的权限包括:

  • 直接授予用户/角色的所有权限
  • 授予给用户/角色所拥有的角色的所有权限

权限的转移

默认方式下,被授予权限的用户/角色无权把得到的权限再授予给另外的用户/角色。

  • 权限的转移是允许的。实现方式:在相应的grant命令后面附加with grant option子句

授予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
TABLES

服务器管理

创建临时表权限

LOCK TABLES

服务器管理

锁表权限

CREATE USER

服务器管理

创建用户权限

PROCESS

服务器管理

查看进程权限

RELOAD

服务器管理

执行flush、 reload等
命令的权限

SHOW DATABASES

服务器管理

查看数据库权限

SHUTDOWN

服务器管理

关闭数据库权限

SUPER

服务器管理

执行kill线程权限

  • 对于普通数据库用户,授予查询、插入、更新、删除数据库中表数据的权限;
  • 对于数据库开发人员,授予创建表、索引、视图、存储过程、存储函数…….等权限;
  • 对于DBA,授予数据库的所有权限。
grant all privileges on *.* to dba with grant option; 

SQL灵活的授权机制

  • DBA:拥有所有对象的所有权限
    • 不同的权限授予不同的用户
  • 用户:拥有自己建立的对象的全部的操作权限
    • GRANT:授予其他用户
  • 被授予的用户
    • "继续授权"许可:再授权
  • 所有授予出去的权限在必要的时候又都可以用REVOKE语句来收回


 

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

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

相关文章

一文学会JavaScript计时事件

文章目录JavaScript 计时事件setInterval() 方法clearInterval() 方法setTimeout() 方法clearTimeout() 方法JavaScript 计时事件 通过使用 JavaScript&#xff0c;我们有能力做到在一个设定的时间间隔之后来执行代码&#xff0c;而不是在函数被调用后立即执行。我们称之为计时…

Linux--基础命令

一、Linux指令 mkdir&#xff08;Make Directory&#xff09;&#xff1a;在当前路径下新建一个目录 -p --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; ls&#xff08;List…

Day796.什么是线程数据的强、弱一致性 -Java 性能调优实战

什么是线程数据的强、弱一致性 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于什么是线程数据的强、弱一致性。 一致性&#xff0c;其实在系统的很多地方都存在数据一致性的相关问题。 除了在并发编程中保证共享变量数据的一致性之外&#xff0c;还有数据库的 ACI…

Autosar基本概念详细介绍

Autosar的由来 在汽车创新应用不断涌现的推动下&#xff0c;当代汽车电子电气&#xff08;E/E—Electronic/Electrical&#xff09;架构已经非常复杂&#xff0c;需要有创新的技术突破才能有效地进行管理&#xff0c;满足日益增长的乘客需求和法律要求。这个需求对汽车制造商及…

记一次简单的HTTP绕WAF

0X01 基础知识 关于WAF的问题&#xff1f; 它是我们日常攻防演练必会遇见的&#xff0c;在IOS七层模型中&#xff0c;WAF分为网络层、应用层的&#xff0c;当然还有云 WAF&#xff08;CDNWAF&#xff09;这新型类场景的。不同环境下我们绕过WAF的思路也是有所区别的&#xff…

mybatis单框架通用mapper使用(二)

mybatis单框架通用mapper使用(二) 1 查询 1.1 简单查询 1.1.1 查多条 a 用法 接口引用.select(实体类对象引用); //里面实体类对象,里面不为null值的部分就会作为条件被查询,多个条件使用and进行拼接起来 //传入为null就是查询全部的值b 测试代码 Testpublic void t2(){Sq…

直播带货系统源码,居家“神器”不出门就能购物

如今&#xff0c;直播带货的火爆程度已经超出了人们的想象。线下销售行业的卖家也开启了直播带货模式&#xff0c;直播带货的的火爆归根到底还是消费者的购物方式发生的变化。从传统的线下购物到电商购物&#xff0c;再到今天的直接直播带货。从各大数据可以总结&#xff0c;消…

应用密码学期末速通复习

文章目录模运算分数求模负数求模gcd最大公约数逆元分组密码DES加密AES加密操作模式ECB电子密码本CBC分组链接CFB密码反馈OFB输出反馈序列密码A5-1算法RC4算法Hash函数Md5算法SHA-1算法消息认证数字信封公钥密码背包公钥算法RSA公钥算法Rabin公钥算法ElGamal公钥算法ECC公钥算法…

C/C++刷题DAY2

1.第一题 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a;对于此题&#xff0c;我们使用双指针的方式去写它&#xff0c;需要注意空间复杂度是O&#xff08;1&#xff09;&#xff0c;时间复杂度也是尽量的越低越好&#xff0c;要去需要原地修改数组&a…

Matplotlib设置刻度和刻度标签

Matplotlib在我们之前的所有例子中都自动接管了轴上间隔点的任务。Matplotlib的默认刻度定位器和格式化器在很多常见情况下通常都足够了。可以明确提及刻度线的位置和标签以满足特定要求。 xticks()和yticks()函数将列表对象作为参数。列表中的元素表示将显示刻度的相应操作的位…

nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇

文章目录前言一、对上一篇博文的分析二、配置文件分析1. nginx 官方网址&#xff08;很详细&#xff09;2、配置文件&#xff08;全&#xff09;3、配置文件&#xff08;去掉注释&#xff09;4、讲解a、nginx 配置文件有三部分组成b、全局块c、events块d、http块5、http块中loc…

无脚本自动化测试

在当今的企业环境中&#xff0c;软件测试不再被视为不必要的投资&#xff1b;相反&#xff0c;它已经上升到一种需要而不是奢侈品的水平。随着市场的不断变化和竞争的加剧&#xff0c;企业必须做一些让他们与竞争对手区分开来的事情。 为了使自己与众不同&#xff0c;公司必须…

Dockerfile

Dockerfile指令集 对于Dockerfiel而言&#xff0c;是在学习docker工具里面&#xff0c;最重点的内容&#xff0c;它可以帮助我们生成自己想要的基础镜像。部署一个容器最重要的就是镜像&#xff0c;指令都已经内置好了。 FROM 这个镜像的妈妈是谁&#xff1f;&a…

数据结构每日亿题(四)

复制带随机指针的链表 原题传送门&#xff1a;力扣 题目&#xff1a; 这题的大概意思就是&#xff1a; 有这样一个链表&#xff0c;他比普通的链表多一个成员变量&#xff1a;random指针&#xff0c;这个random指针指向的是这个链表中随机一个地方&#xff0c;这个地方是其它节…

NetSim网络仿真使用及静态路由配置

&#x1f370; 个人主页:__Aurora__ &#x1f35e;如果文章有什么需要改进的地方还请各位大佬指正。 &#x1f349;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ NetSim网络仿真使用及静态路由配置。 实验要求及其步骤 使用Boson N…

Java面试笔记:Java线程安全的集合类有哪些?线程不安全的集合类有哪些?ArrayList为什么会发生并发修改异常?

一、Java的集合类有哪些&#xff1f; 二、如何定义集合是线程不安全的&#xff1f; 当多个并发同时对线程不安全的集合进行增删改的时候会破坏这些集合的数据完整性&#xff0c;例如&#xff1a;当多个线程访问同一个集合或Map时&#xff0c;如果有超过一个线程修改了A…

3A企业认定有哪些好处?

企业参与申报和认证有什么益处&#xff1f;这个问题可能应该是广大企业参与前最为关心的问题之一了 1、可快速有效提升企业资质、获得国家政府的认可&#xff1b;并将获得由商务部颁发的具有统一编号的牌匾和证书。 2、是企业履约能力、投标信誉、综合实力与竞争力的体现&…

数学建模--优化类模型

目录 一、根据目标函数约束条件类型分类 1、线性规划 ①线性规划模型的一般形式 ​②用MATLAB优化工具箱解线性规划 ③模型分析 2、非线性规划 ①非线性规划的基本概念 ②非线性规划的基本解法 ③二次规划 ④一般非线性规划 二、控制变量类型分类 1、整数规划 …

总结线程安全问题的原因和解决方案

一. 线程安全问题 概念 首先, 线程安全的意思就是在多线程各种随机调度的情况下, 代码不出现 bug 的情况. 如果在多线程调度的情况下, 出现 bug, 那么就是线程不安全. 二. 观察线程不安全的情况 下面我们用多线程来累加一个数, 观察线程不安全的情况: 用两个线程, 每个线程…

树--堆和优先权队列

数据结构中的堆和栈与操作系统内存划分中的堆和栈没有关系 一、堆的定义 一个大小为n的堆是一棵包含n个结点的完全二叉树&#xff0c;其根节点称为堆顶。 根据堆中亲子结点的大小关系&#xff0c;分为大堆和小堆&#xff1a; &#xff08;1&#xff09;最小堆&#xff1a;树中…