视图和用户权限

1.视图(view)

  • 看一个需求

    emp表的列信息很多,有些信息是个人重要信息(比如:sal、comm、mgr、hiredate),如果我们希望某个用户只能查询emp表的empno、enamel、job和deptno信息,有什么办法呢?

    答案是使用视图。

1.1基本原理

  1. 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实的表(基表)

    视图和基表关系的示意图:

  2. 对视图的总结

    • 视图是根据基表(可以是多个基表)来创建的,视图是虚拟的表
    • 视图也有列,数据来自基表
    • 通过视图可以修改基表的数据
    • 基表的改变也会影响到视图的数据

1.2视图使用细节

  • 语法
1. create view 视图名 as select 语句 -- 创建一个视图
2. alter view 视图名 as select 语句 -- 修改视图,更新成新的视图
3. show create view 视图名 -- 显示创建视图的指令
4. drop view 视图名1[,视图名2,...] -- 删除视图

例子

完成前面提出的需求

创建一个视图emp_view01,只能查询emp表的empno、ename、job和deptno列的信息

SELECT * FROM emp;
-- 创建一个视图emp_view01,只能查询emp表的empno、ename、job和deptno列的信息 -- 创建视图
CREATE VIEW emp_view01
AS
SELECT empno,ename,job,deptno FROM emp; -- 查看视图
DESC emp_view01;
SELECT * FROM emp_view01;
SELECT empno, job FROM emp_view01; -- 显示创建视图的指令
SHOW CREATE VIEW emp_view01; -- 删除视图
DROP VIEW emp_view01;
  • 视图细节讨论
  1. 创建视图后,到数据库去看,对应的视图只有一个视图结构文件(形式:视图名.frm)

    视图的数据只是来源于基表,本身是没有数据的(一个映射关系)

  2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图 [insert,delete,update]

  3. 视图中可以再使用视图,数据仍然来自基表

-- 视图细节讨论
-- 1. 创建视图后,到数据库去看,对应的视图只有一个视图结构文件
-- (形式:视图名.frm) -- 2. 视图的数据变化会影响到基表 [insert,delete,update]
UPDATE emp_view01 SET job = 'MANAGER' WHERE empno=7369;-- 修改视图
SELECT * FROM emp; -- 查询基表,,发现数据变了 -- 基表的数据变化也会影响到视图
UPDATE emp SET job = 'SALESMAN' WHERE empno=7369;-- 修改基表
SELECT * FROM emp_view01; -- 查询视图,发现数据变了 -- 3. 视图中可以再使用视图,比如从emp_view01视图中选出empno和ename做出新的视图
CREATE VIEW emp_view02
AS
SELECT empno,ename FROM emp_view01;

1.3视图应用实例

  • 视图最佳实践
  1. 安全:

    一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。

  2. 性能:

    关系数据库的数据常常会分表存储,使用外键建立这些表之间的关系。这时,数据库查询经常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图(基于多个基表),将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。

  3. 灵活:

    如果系统中有一张旧的表,这张表由于设计的问题即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新的表。这样就可以少做很多改动,也达到了升级数据表的目的。

  • 练习

    针对emp,dept,salgrade三张表。创建一个视图emp_view03,可以显示雇员编号,雇员名,雇员部门名称和薪水级别。

    -- 针对emp,dept,salgrade三张表。
    -- 创建一个视图emp_view03,可以显示雇员编号,雇员名,雇员部门名称和薪水级别。
    /*
    分析:
    1.使用三张表联合查询,得到结果
    笛卡尔乘积 = 表1记录数*表2记录数*表3记录数
    利用过滤条件 emp.deptno= dept.deptno AND sal>=losal AND sal<=hisal
    2.将结果构建成视图
    */
    CREATE VIEW emp_view03
    AS
    SELECT empno,ename,dname,grade
    FROM emp,dept,salgrade
    WHERE emp.deptno= dept.deptno AND
    sal>=losal AND sal<=hisal DESC emp_view03
    SELECT * FROM emp_view03


2.MySQL管理

2.1Mysql用户管理

  • MySQL用户

mysql中的用户,都存储在系统数据库mysql中的user表中


其中user表的重要字段说明:

  1. host:允许登录的“位置“,localhost表示该用户只允许本机登录,也可以指定ip地址,如:192.168.1.100
  2. user:用户名
  3. authentication_string:密码,是通过mysql的password()函数加密之后的密码。
  • 创建用户
create user '用户名'@'允许登录的位置' identified by '密码' -- 创建用户,同时指定密码
  • 删除用户
drop user '用户名'@'允许登录的位置';

例子

-- mysql用户管理
-- 原因:当我们做项目开发时,可以根据不同的开发人员,赋给他们相应的操作权限
-- 所以,mysql数据库管理人员(root),根据需要创建不同的用户,赋给相应的权限,供人员使用 -- 1.创建新用户
-- 1.1 'liyuelian'@'localhost' 表示用户的完整信息
-- 'liyuelian' 用户名 'localhost' 登录ip -- 1.2 123456 为密码,在mysql表存放的是password函数加密过后的密码
-- *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
CREATE USER 'liyuelian'@'localhost' IDENTIFIED BY '123456'; SELECT `host`,`user`,authentication_string FROM mysql.user; -- 2.删除用户
DROP USER 'liyuelian'@'localhost'; -- 3.登录

不同的数据库用户,登录到DBMS后,根据相应的权限,可以操作的数据库和数据对象(表,视图,触发器)都不一样

  • 用户修改密码
-- 修改自己的密码
set password = password('密码');
-- 修改他人的密码(需要有修改用户密码权限)
set password for'用户名'@'登录的位置' = password('密码');

例子

-- 修改本用户密码
SET PASSWORD= PASSWORD('abcdef'); -- 修改他人的密码(需要有修改用户密码权限)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');-- 错误,提示权限不够 -- 切换到root用户,修改一般用户的密码
SET PASSWORD FOR 'olien'@'localhost' = PASSWORD('123456');-- 成功,root用户权限很高

2.2Mysql权限管理

  • Mysql中的权限

  • 给用户授权

    # 基本语法:
    grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码'] #说明:
    # 1. 权限列表,多个权限用逗号分开
    # 如:grant select on....
    # grant select ,delete,create on.... #2. 特别说明
    # *.* :表示本系统中的所有数据库的所有对象(表,视图,存储过程)
    # 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程) # 3. identified by可以省略,也可以写出
    # (1)如果用户存在,就是修改该用户的密码
    # (2)如果该用户不存在,就是创建该用户
  • 回收用户权限

    #基本语法
    revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
  • 权限生效指令

    #如果权限没有生效,可以执行下面命令
    #基本语法
    flush privileges;

练习

  1. 创建一个用户(用户名随意),密码为123,并且只可以从本地登录,不让远程登录mysql
  2. 创建testdb库和表news,要求:使用root用户创建
  3. 给用户分配查看news表和添加数据的权限
  4. 测试看看用户是否只有这几个权限
  5. 修改密码为abc,要求使用root用户完成
  6. 重新登录
  7. 回收新用户的权限
  8. 使用root用户删除你的用户

root用户:

-- 演示用户权限的管理
-- 1. 创建一个用户(用户名随意),密码为123,并且只可以从本地登录,不让远程登录mysql
CREATE USER 'olien'@'localhost' IDENTIFIED BY '123'; -- 2. 创建testdb库和表news,要求:使用root用户创建
-- 使用root用户创建库和表
CREATE DATABASE testdb;
CREATE TABLE news(
id INT ,
content VARCHAR(32)
)
-- 添加一条测试数据
INSERT INTO news VALUES(100,'北京新闻'); -- 3. 给用户分配查看news表和添加数据的权限
-- 4. 测试看看用户是否只有这几个权限
GRANT SELECT,INSERT
ON testdb.news
TO 'olien'@'localhost'; -- 5. 修改olien用户的密码为abc,要求使用root用户完成
SET PASSWORD FOR'olien'@'localhost' = PASSWORD('abc'); -- 6. 重新登录 -- 7.回收新用户的权限
REVOKE SELECT,INSERT ON testdb.news FROM 'olien'@'localhost'; -- 8. 使用root用户删除你的用户
DROP USER 'olien'@'localhost';

新创建的用户:

-- 在默认情况下,olien用户只能看到一个默认的系统数据库

SELECT * FROM news;

INSERT INTO news VALUES(200,'上海新闻');

-- 测试看看用户是否只有这几个权限
-- 不能进行没有授权的操作,如:update
UPDATE news SET content ='广州新闻'
WHERE id = 100; -- 错误,提示没有权限

2.3Mysql管理细节

细节说明:

  1. 在创建用户的时候,如果不指定host,则默认为%,%表示所有的IP都有连接权限 。如create user xxx;
  2. 也可以这样指定:create user 'xxx'@'192.168.1.%' ,表示xxx用户在192.168.1.*的ip地址都可以登录mysql
  3. 在删除用户时,如果host不是%,需要明确指定'用户'@'host值'

例子

-- 细节说明:
-- 1. 在创建用户的时候,如果不指定host,则默认为%,%表示所有的IP都有连接权限.如create user xxx;
CREATE USER 'jack'; SELECT `host`,`user` FROM mysql.user; -- 2. 也可以这样指定:create user 'xxx'@'192.168.1.%'
-- 表示xxx用户在192.168.1.*的ip地址都可以登录mysql
CREATE USER 'smith'@'192.168.1.%' -- 3. 在删除用户时,如果host不是%,需要明确指定'用户'@'host值'
DROP USER jack; -- 默认就是 drop user 'jack'@'%'
DROP USER smith@'192.168.1.%'

day09-2视图和用户权限的更多相关文章

  1. Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】

    前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...

  2. Oracle总结【视图、索引、事务、用户权限、批量操作】

    前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了...那么本篇主要总结关于Oralce视图.序列.事务的一些内容... 在数据库中,我们可以把各种的SQL语句分为四大类 ...

  3. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  4. T-Sql(七)用户权限操作(grant)

    一般数据库的权限操作我们很少用,除非一些大型的项目,需要给数据库配置不同的用户及权限,防患于未然,今天我们就来了解下t-sql中配置用户权限操作. 先看示例代码: --创建登录名 create log ...

  5. oracle查看当前用户权限

    查看用户和默认表空间的关系select username,default_tablespace from dba_users;--查看当前用户能访问的表select * from user_table ...

  6. 转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

    相关参考资料: MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. gr ...

  7. mysql grant用户权限设置

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant sele ...

  8. 如何实现Oracle修改用户权限 .

    这里将介绍Oracle修改用户权限的实现过程,包括一些权限管理方面的东西.希望通过本文能对大家了解Oracle修改用户权限有所帮助. ORACLE数据库用户与权限管理 ORACLE是多用户系统,它允许 ...

  9. 转 MySQL 用户权限详细汇总

    http://blog.csdn.net/mchdba/article/details/45934981 1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一 ...

随机推荐

  1. vue中如何在自定义组件上使用v-model和.sync

    自定义事件 tips 推荐始终使用 kebab-case 的事件名.(v-on会将事件名自动转换为小写,避免匹配不到) changeData × change-data √ 自定义组件的v-model ...

  2. 【ASP.NET Core】选项类的依赖注入

    咱们继续上一个话题.先简单复习一下,根据老周前面文章的介绍,选项类体系的基本套路是通过 IOptionsFactory 来创建选项类实例的.而我们在服务容器(IServiceCollection)上是 ...

  3. 使用node命令提示: ‘node‘ 不是内部或外部命令,也不是可运行的程序

    使用node命令提示: 'node' 不是内部或外部命令,也不是可运行的程序 该删的都删了,一切没有任何问题,还nvm use 报错乱码的,只要打开命令提示符  ,以管理员身份运行,就一些正常了 (就 ...

  4. PHP小工具

    防SQL注入 function clean($input) { if (is_array($input)) { foreach ($input as $key => $val) { $outpu ...

  5. Redis 06 哈希

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 哈希就是 ke ...

  6. DS队列----银行单队列多窗口模拟

    题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本 ...

  7. Windows下ESP32 环境搭建(基于esp-idf FreeRTOS)

    1. 之前的尝试(失败的尝试) 咸鱼买了3块ESP32开发板.背面写了NODEMCU v1.1,好像这玩意可以直接写lua,也可以刷Micropython写python,还可以用Arduino IDE ...

  8. transform: scale() 实现鼠标悬浮在元素之上出现和消失

    前言 transform属性允许你旋转,缩放,倾斜或平移给定元素.其中scale(x, y)就是实现元素缩放的属性值. scale(x, y)的 x 乘以原本元素的 x:y 乘以原本的元素 y,就可以 ...

  9. 重复造轮子 SimpleMapper

    接手的项目还在用 TinyMapper 的一个早期版本用来做自动映射工具,TinyMapper 虽然速度快,但在配置里不能转换类型,比如 deleted 在数据库中用 0.1 表示,转换成实体模型时没 ...

  10. 接入Twitter和Facebook分享踩坑记录

    准备工作 1.首先需要在HTML的head添加下述meta标签内容,在分享时,Twitter和Facebook会爬取该网站页面的meta内容,然后生成分享卡片. 2.按照下述配置完成后,需要把内容发布 ...