数据库系统概念 | 第四章:中级SQL

news2024/12/27 13:02:45

文章目录

  • 📚 连接表达式
    • 🐇 自然连接
    • 🐇 连接条件
      • 🥕natural条件
      • 🥕using 条件
      • 🥕on 条件
    • 🐇 内连接和外连接
      • 🥕 内连接`inner join`
      • 🥕 外连接`outer join`
        • 🍃 左外连接`left outer join`
        • 🍃 右外连接`right outer join`
        • 🍃 全外连接`full outer join`
        • 🍃 on和where在外连接中的不同用法
      • 🥕 其余连接方式
      • 🥕 关系的连接
        • 🍃内连接和外连接可视化示例
        • 🍃 连接一览图
  • 📚 视图
    • 🐇 视图定义
      • 🥕`create view`
      • 🥕`drop view`
      • 🥕说明
    • 🐇 在SQL查询中使用视图
    • 🐇 物化视图
    • 🐇 视图更新
      • 🥕可更新的视图条件
      • 🥕可更新的视图操作
      • 🥕with check option
  • 📚 事务
    • 🐇 事务概述
    • 🐇 事务指令
    • 🐇 事务示例
  • 📚 完整性约束
    • 🐇完整性
      • 🥕 完整性子系统
      • 🥕完整性规则
    • 🐇 单个关系上的约束
      • 🥕 非空约束
      • 🥕 唯一性约束
      • 🥕 check语句
    • 🐇 引用完整性
      • 🥕主码约束
      • 🥕外码约束
      • 🥕references子句与foreign key子句
      • 🥕删除或修改基本关系上的元组情况
        • 🍃 删除基本关系(被参照关系)元组
        • 🍃 修改基本关系(被参照关系)主码
    • 🐇 给约束赋名
      • 🥕关系约束
      • 🥕域约束
    • 🐇 事务中对完整性约束的违反
    • 🐇 复杂check条件与断言
      • 🥕全局约束
      • 🥕 断言(assertion)
  • 📚 SQL的数据类型与模式
    • 🐇 SQL中的日期和时间类型
    • 🐇 类型转换和格式化函数
      • 🥕 cast
      • 🥕 coalesce
      • 🥕 decode
    • 🐇 缺省值(默认值)
    • 🐇 大对象类型
    • 🐇 用户定义的类型
    • 🐇 create table的扩展
      • 🥕创建与现有某表模式相同的表
      • 🥕创建包含查询的结果的表
    • 🐇 模式、目录与环境
  • 📚 SQL中的索引定义
    • 🐇 作用
    • 🐇创建索引
    • 🐇删除索引
  • 📚 授权
    • 🐇 权限的授予与收回
      • 🥕角色
      • 🥕授权命令
        • 🍃 视图的授权
        • 🍃 模式的授权
        • 🍃 权限的转移
      • 🥕收权命令
        • 🍃 级联收回(默认)
        • 🍃 `restrict`防止级联收回
        • 🍃 仅仅收回grant option,保留其他权限
        • 🍃 通过角色授权,避免用户授权的级联收回
    • 🐇 权限控制命令一览
      • 🥕概述
      • 🥕创建账户
      • 🥕修改账户名
      • 🥕删除账户
      • 🥕查看权限
      • 🥕授予权限
      • 🥕删除权限
      • 🥕更改密码

📚 连接表达式

连接可以替换子查询,并且⼀般比子查询的效率更快

🐇 自然连接

  • natural join出现在结果关系中的两个连接关系的元组在全部公共属性上取值相等,且公共属性只出现一次

  • natural join 关系名 using (A1,A2,...,An) ,(A1,A2,…,An)是两个连接关系的公共属性的子集,元组在(A1, A2 ,…, An)上取值相等,且(A1, A2 ,…, An)只出现一次

  • natural join 关系名 on <谓词P>出现在结果关系中的两个连接关系的元组在公共属性上取值满足谓词条件P,且公共属性出现两次(但取值完全相同)

    • 示例:只显示一次ID值和显示两次ID值的不同

      /*显示两次ID*/
      select * 
      from student join takes on student.ID=takes.ID 
      /*只显示一次ID*/
      select student.ID as ID,name,dept_name,tot_cred,course_id,sec_id,semester,year,grade
      from student join takes on student.ID=takes.ID
      

🐇 连接条件

🥕natural条件

  • 在from中作用于多个关系,产生一个关系作为结果

  • 在结果关系中的两个连接关系的元组在公共属性上取值相等

  • 结果关系中,公共属性只出现一次。顺序是先列出公共属性,然后是只出现在第一个关系中的属性,最后是那些只出现在第二个关系中的属性

这里是引用
在这里插入图片描述
在这里插入图片描述

🥕using 条件

  • 指定属性连接,不考虑未指定的共同属性

  • 只考虑关系名2与关系名1在属性名1…属性名n上的匹配,其他的共有属性不考虑

  • 这里的关系名可以是自然连接后的关系,即from(关系名1 join 关系名2)join 关系名3 using (属性名1,属性名2,...属性名n)

🥕on 条件

  • 通过on <谓词>子句决定两个关系中哪些元组相互匹配,以及连接结果中出现哪些属性

  • 🔑on子句特点

    • on条件可表示任何谓词,可表示比自然连接更丰富的连接条件

    • 对于外连接,on条件的表现与where不同(在下文中会做出详细解释

    • 可以用on替代where限定条件,而on和where仍可同时存在,只是限定的条件不同——在on子句中指定连接条件在where中指定其他条件,更清晰易懂

    示例:下面两个代码是等价的

    select *
    from student, takes
    where student.ID=takes.ID
    /******/
    select * 
    from student join takes on student.ID=takes.ID 
    

🐇 内连接和外连接

决定如何处理与连接条件不匹配的元组

🥕 内连接inner join

  • 舍弃不匹配的元组,是默认连接类型(关键词inner可选在这里插入图片描述

  • 内连接提供连接的列,而自然连接自动连接所有同名列,因此自然连接是内连接的一种,即natural join等价于natural inner join

    • 解释:两个关系在自然连接时,公共属性可能存在元组不完全对应的情况,那么正常情况下的自然连接都是内连接,会舍弃那部分不对应的元组,而只保留完全对应的结果集

🥕 外连接outer join

通过在结果中创建包含空值元组的方式,保留那些在连接中丢失的元组

🍃 左外连接left outer join

  • 内连接+左侧失配的元组(缺少的右侧关系属性用null)在这里插入图片描述

🍃 右外连接right outer join

  • 内连接+右侧失配的元组(缺少的左侧关系属性用null)在这里插入图片描述

🍃 全外连接full outer join

  • 内连接 + 左侧失配的元组(缺少的右侧关系属性用null)+ 右侧失配的元组(缺少的左侧关系属性用null)在这里插入图片描述

🍃 on和where在外连接中的不同用法

示例

select *
from student left outer join takes on true
where student.ID=takes.ID
  • 代码解释

    • on条件是外连接声明为true的一部分

    • where子句不是且会排出不符合条件的元组

    • 此例结果中不会包含空值的元组

    • 外连接实际产生了两个关系的笛卡尔积

  • 简而言之,先on后where

  • SQL 中 on 条件与 where 条件的区别示例详解补充博客

🥕 其余连接方式

  • cross join:两个关系的笛卡儿积

  • union join:左边关系中失配的元组+ 右边关系中失配的元组

🥕 关系的连接

  • 对于外连接,连接条件是必须的

  • 对于内连接,连接条件是可选的,没有连接条件等价于两个关系的笛卡儿积

🍃内连接和外连接可视化示例

  • 已知关系R

    ABC
    a1b1c1
    a2b2c2
    a3b3c3
  • 已知关系S

    CD
    c1d1
    c2d2
    c4d3
  • 内连接 R inner join S on R.C = S.C

    ABR.CS.CD
    a1b1c1c1d1
    a2b2c2c2d2
  • 左外连接 R left outer join S on R.C = S.C

    ABR.CS.CD
    a1b1c1c1d1
    a2b2c2c2d2
    a3b3c3nullnull
  • 右外连接 R natural right outer join S

    CDAB
    c1d1a1b1
    c2d2a2b2
    c4d3nullnull
  • 全外连接 R full outer join S on R.C = S.C

    ABR.CS.CD
    a1b1c1c1d1
    a2b2c2c2d2
    a3b3c3nullnull
    nullnullnullc4d3

🍃 连接一览图

在这里插入图片描述

📚 视图

🐇 视图定义

🥕create view

  • 定义视图

    create view 视图名<(属性名,属性名...)]>  
    as (查询表达式)
    

🥕drop view

  • 撤消视图

    drop view 视图名
    

🥕说明

  • 视图是基于 SQL 语句的结果集的可视化的表

  • 作为虚关系,对用户可见的关系,本身不包含数据,也就不能对其进行索引操作

  • 视图关系在概念上包含查询结果的元组,但并不进行预计算和存储结果元组,只存储与视图关系相关联的查询表达式。当视图关系被访问时,才计算产生查询结果元组

  • view和table的区别

    • 表被创建时表的内容被加载

    • 视图的内容总是反映着当前查询的结果

🐇 在SQL查询中使用视图

  • 在查询中,视图名可以出现在任何关系名可以出现的地方

  • 视图的属性名缺省为子查询结果中的属性名,也可以显式指明

🐇 物化视图

  • 物化视图:某些DBS允许存储视图,但保证如果定义视图的实际关系改变,视图也跟着修改
  • 物化视图维护:保持物化视图一直在最新状态
  • 频繁使用视图的应用将会从视图的物化获益
  • SQL没有定义指定物化视图的标准方式

🐇 视图更新

视图更新最终是对所涉及的实表的更新。由视图更新导致实表更新可能带来问题,简而言之,视图更新需要条件

🥕可更新的视图条件

  • from 子句中只有一个数据库关系

  • select 中只包含关系属性名,不包含表达式、聚集、distinct声明

  • 没有出现在select子句中的任何属性允许null的存在,出现在select子句中的(显然是主码)有非空约束

  • 查询中不含group by 或 having 子句

🥕可更新的视图操作

  • update、insert、delete

🥕with check option

  • 视图定义时,指定with check option,则用户通过视图进行数据修改时,结果必须为满足视图where子句条件的元组,否则拒绝更新

  • 示例:
    在这里插入图片描述

    /*无with check option*/
    create view sv1 as
    	   select sno,sname,sage from s
    	   where sdept = '计' and sage >= 20;
    update sv1 set sage = 19 where sno = 's2';
    /*可以更新,更新后元组不再出现在视图中*/
    
    /*有with check option*/
    create view sv1 as
    	   select sno,sname,sage from s
    	   where sdept = '计' and sage >= 20
    	   with check option;
    update sv1 set sage=19 where sno = 's2';
    /*不可以更新,update语句将被DBMS拒绝*/
    

📚 事务

  • 事务由查询和(或)更新语句的序列组成
  • 事务开始
    • 一个sql执行,隐含开始了一个事务
  • 结束事务
    • commit work:完成所有事务,提交事务
    • rollback work:不能成功完成所有任务,回滚事物
    • 注:commit和rollback其后的sql属于新的事务

🐇 事务概述

  • 不能回退 select 语句,回退 select 语句也没意义;也不能回退 create 和 drop 语句

  • MySQL 默认是隐式提交,每执行⼀条语句就把这条语句当成⼀个事务然后进行提交。当出现 start transaction 语句时,会关闭隐式提交;当 commitrollback 语句执行后,事务会自动关闭,重新恢复隐式提交

  • 通过 set autocommit = 0 可以取消自动提交,直到 set autocommit = 1 才会提交

    • autocommit 标记是针对每个连接而不是针对服务器的。

🐇 事务指令

  • begin atomic ... end

    • 在关键字begin atomic … end之间的所有语句构成一个单独的事务(部分数据库不支持)
  • start transaction ——用于标记事务的起始点。

  • savepoint ——用于创建保留点。

  • rollback to ——用于回滚到指定的保留点;如果没有设置保留点,则回退到start transaction语句处。

  • commit ——提交事务

🐇 事务示例

在这里插入图片描述


在这里插入图片描述

📚 完整性约束

🐇完整性

指数据的正确性和相容性

🥕 完整性子系统

在这里插入图片描述

🥕完整性规则

在这里插入图片描述

🐇 单个关系上的约束

  • create table 命令中的约束
    • 主码约束
    • not null
    • unique
    • check (<谓词>)
    • alter table 关系名 add/drop/change/modify 约束条件

🥕 非空约束

  • 非空约束not null禁止对该属性插入空值,是域约束的一种
  • 主码一定非空,则不必加上非空约束

🥕 唯一性约束

  • unique (属性1,属性2,...,属性n)约束在关系中没有两个元组能在所有列出的属性上取值相同
  • 即unique约束声明属性列表形成一个超码

🥕 check语句

  • check( P )子句指定一个谓词P,关系中的每个元组都必须满足谓词P

  • check子句可以单独出现,也可以作为属性声明的一部分出现(对单个属性值的约束check与该属性一起列出,更复杂的check子句则在create table语句的末尾单独列出)

  • check语句模拟枚举类型示例

    create table section
           (course_id varchar(8),sec_id varchar(8),semester varchar(6),,
            primary key (course_id, sec_id, semester, year),
            check(semester in ('Fall','Winter','Spring','summer')))
    
  • 用create domain定义域时,可以出现check

    create domain AGE_domain smallint check((value >= 15) and value <= 25))
    

🐇 引用完整性

🥕主码约束

  • 主码约束定义形式

    • 主码子句:primary key (属性名)

    • 主码短语:属性名 数据类型(域值) primary key

  • 主码值不允许空,也不允许出现重复

  • 通过主码来唯一标识,主码非空

🥕外码约束

  • 外码约束定义形式
    • foreign key (外码) references 关系名(主码)
  • 外码取值或为空或为references后关系中某个对应的主码的值
  • 作为主码的关系称为基本(被参照)关系,作为外码的关系称为依赖(参照)关系

🥕references子句与foreign key子句

  • references子句作为属性定义的一部分,声明外码

  • foreign key子句可以指明:如果被参照关系上的删除或更新动作违反了约束,系统必须采取一些步骤通过修改参照关系中的元组来恢复完整性,而不是简单拒绝

🥕删除或修改基本关系上的元组情况

🍃 删除基本关系(被参照关系)元组

  • restrict方式
    • 只有当依赖关系中没有一个外码值与要删除的基本关系的主码值相对应时,才可以删除该元组,否则系统拒绝此删除操作
  • cascade方式
    • 将依赖关系中所有外码值与基本关系中要删除的主码值所对应的元组一起删除
  • set null方式
    • 删除基本关系中元组时,将依赖关系中与基本关系中被删主码值相对应的外码值置为空值

🍃 修改基本关系(被参照关系)主码

  • restrict方式
    • 只有当依赖关系中没有一个外码值与要修改的基本关系的主码值相对应时,才可以修改该元组主码,否则系统拒绝此次修改
  • cascade方式
    • 将依赖关系中所有与基本关系中要修改的主码值所对应的外码值一起修改为新值
  • set null方式
    • 修改基本关系中元组主码时,将依赖关系中与基本关系中被修改主码值相对应的外码值置为空值

🐇 给约束赋名

  • 约束赋名:统一化完整性约束

    • 格式:constraint 约束名 <约束条件>

🥕关系约束

  • 约束的创建
    • 格式:create table constraint 约束名 <约束条件>
  • 约束的撤消
    • 格式:alter table 关系名 drop constraint 约束名
  • 约束的添加
    • 格式:alter table 关系名 add constraint 约束名 <约束条件>

🥕域约束

  • 域约束的创建
    • 格式:create domain constraint 约束名 <约束条件>
  • 域约束的撤消
    • 格式:alter domain 关系名 drop constraint 约束名
  • 域约束的添加
    • 格式:alter domain 关系名 add constraint 约束名 <约束条件>

🐇 事务中对完整性约束的违反

  • 事务的中某一步骤会暂时违反完整性约束,但是后面的某一步会消除这个违反

  • 默认约束是立即检查,但约束声明中加入initially deferred子句,可以延迟约束检查,并在事务结束时检查。

    • 一个约束可以被指定为deferrable可延迟的。对于可延迟的约束,执行 set constraints constrain-list deferred 命令作为事务一部分,延迟到事务结束时检查。

    • 许多数据库实现不支持延迟约束

🐇 复杂check条件与断言

🥕全局约束

复杂check条件,check子句中使用子查询

  • 全局约束涉及多个属性间的或多个关系间的联系

  • 示例

    create table SC
    (Sno char(4),
     Cno char(4),
     GRADE smallint,
     primary key (Sno, Cno),
     check (Sno in (select Sno from S)),
     check (Cno in (select Cno from C)))
    

🥕 断言(assertion)

断言是一个谓词,表达数据库总应该满足的条件

  • 格式

    • 建立断言:create assertion 断言名 check 条件

    • 撤销断言:drop assertion 断言名

  • 特点

    • 一旦定义了断言,系统验证其有效性,并且对每个可能违反该断言的更新操作都进行检查

    • 域约束和参照完整性约束就是断言的特殊形式

  • 示例1:只允许女同学选修张老师课程

    create assertion ASSE2 
    check (not exists (select *
    			       from SC
    			       where Cno in (select Cno
    				                 from C
    				                 where TEACHER = ‘张’) and Sno in (select Sno
    				                                                  from S
    				                                                  where SEX = ‘M’)))
    

    示例2:每门课最多50名男同学选修

    create assertion ASSE1 
    check (50 >= all (select count(SC.Sno)
    			 	  from S, SC
    			 	  where S.Sno = SC.Sno and  SEX = ‘M’
    			 	  group by Cno)))
    

📚 SQL的数据类型与模式

🐇 SQL中的日期和时间类型

  • date:日历日期,包括年(4位)、月、日

  • time:一天中的时间,包括时、分、秒

    • 可用time(p)表示秒的小数点后位数(默认0)

    • 指定time with timezone,可以加时区信息

  • timestamp: date与time的组合可用

    • timestamp(p)表示秒的小数点后位数(默认6)

    • 指定with timezone,可以加时区信息

例: date ‘2001-04-25’ time ‘09:30:00’ timestamp ‘2001-04-25 09:29:01.45’

  • 字符串与日期、时间类型转换

    • cast string to t
  • 从日期、时间中提取单独的域

    • extract (field from d)
      • field 可以是year,month,day,hour,minute,second ;

      • 时区中的信息用timezone_hour,timezone_minute等

  • 获取当前日期、时间函数

    • 返回当前日期:current_date

    • 返回当前时间(带时区):current_time

    • 返回当前本地时间(不带时区):local_time

    • 时间戳:current_timestamp,locate_timestamp

  • 运算结果:interval类型

🐇 类型转换和格式化函数

🥕 cast

  • cast (e as t)将表达式e的数据类型转换为类型t

  • 示例

    select name,age,country,
    cast(born as date) as born 
    from table
    where born >= "2000-01-01"
    /*等价于where cast(born as date) >= 2000-01-01*/
    

🥕 coalesce

  • 处理空值的函数,可以用coalesce选择在查询结果中输出空值的方式

  • 该函数接收任意数量的参数,且所有参数必须同类型(如果不同类型需要使用decode),返回第一个非空参数

  • 示例:显示教师的ID和工资,并将空工资显示为0

    select ID,coalesce(salary,0) as salary
    from instructor
    

🥕 decode

  • 解码(decode)允许其属性参数不必是同一类型,在Oracle中可用

  • 格式

    decode(value,match-1,replacement-1,match-2,replacement-2...default-replacement)
    
    • 比较value值与match值。若找到匹配项,则用替换值替换原属性;若未找到匹配项,则用缺省值替换属性值
  • 示例:显示教师的ID和工资,并将空工资显示为’N/A’

    select ID,decode(salary,null,'N/A',salary) as salary
    from instuctor
    

🐇 缺省值(默认值)

  • 为关系中属性指定缺省值(默认值),当一个元组被插入关系中时,如果没有给出其全部或部分属性的值 ,那么该元组在此属性上的取值为default规定的默认值,而非null

  • 示例:tot_cred属性默认值为0

    create table student 
    (ID varchar(5),
     name varchar(20) not null,
     dept_name varchar(20) ,
     tot_cred numeric(3,0) default 0,
     primary key (ID))
    

🐇 大对象类型

  • SQL提供字符数据的大对象数据类型clob和二进制数据的大对象数据类型blob

    • 例如:我们可以声明属性
    bookview clob (10KB) 
    image blob (10MB) 
    movie blob (2GB) 
    

🐇 用户定义的类型

  • 独特类型

    • 格式:create type 新类型对应的名称 as 新类型的具体内容 final

    • 示例:Dollars和Pounds为新的数据类型

      create type Dollars as numeric(12,2) final;
      create type Pounds as numeric(12,2) final;
      
    • 类型和域的差异

      • 在域上可以声明诸如非空那样的约束,也可以为域类型的变量定义缺省值,然而在用户自定义类型上不能声明约束或缺省值。用户自定义类型不仅被设计用来指定属性类型,而且还被用在不能施加约束的地方以对SQL进行过程扩展

      • 域并不是强类型的。其结果是,一个域类型的值可以被赋值给另一个域类型(cast),只要它们的基本类型是相容的

  • 结构化数据类型

    • 允许创建具有嵌套记录结构、数组和多重集的复杂数据结构

🐇 create table的扩展

🥕创建与现有某表模式相同的表

  • 示例:create table temp_instructor like instructor

🥕创建包含查询的结果的表

  • 示例:

    create table t1 as (select * 
                        from instructor 
                        where dept_name = 'Music') 
    with data
    /*很多数据库实现在省略with data子句时,默认加载数据*/
    

🐇 模式、目录与环境

  • 当代数据库系统提供三层结构的关系命名机制:目录catalog 、模式schema、关系/视图对象

    • 用户连接到数据库(验证身份)后,有一个默认的目录和模式,默认目录和默认模式可以省略

    • 每个数据库连接会建立SQL环境:包括目录、模式和用户授权标识

      • 大多数数据库系统,环境随用户账户创建而自动创建,此时模式名被置为用户账户名

      • 用create schema和drop schema语句创建、删除模式

📚 SQL中的索引定义

🐇 作用

  • 通过索引可以更加快速高效地查询关系中具有该属性指定值的元组数据

  • 用户无法看到索引,它们只能被用来加速查询

🐇创建索引

  • create index 索引名 on 关系名(属性名)

  • 创建唯⼀索引

    • 唯⼀索引(使用unique关键字)表明此索引的每⼀个索引值只对应唯⼀的数据记录

    • create unique index 索引名 on 关系名(属性名)

🐇删除索引

  • alter table 关系名 drop index 索引名
  • 注意 : 更新⼀个包含索引的表需要比更新⼀个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引

📚 授权

🐇 权限的授予与收回

🥕角色

授权前首先要确定一个角色集,可以给角色授予权限(角色是用户的虚拟体现)

  • 创建角色: create role 角色名

  • 给角色授权:grant 权限列表 on 关系名/视图名 to 用户/角色名

  • 角色可以授予用户或其他角色

    • 示例:角色链中的权限继承

      create role dean;
      grant instructor to dean;
      grant dean to Satoshi;
      
  • 角色的权限包括

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

    • 授予该用户/角色所拥有的角色的所有权限

🥕授权命令

  • 格式

    grant <权限列表> on <关系名/视图名>  
    to <用户/角色列表/public> 
    <with grant option>
    
    • 格式解读
      • 权限列表包括:select, update, insert, delete, index, alter, drop, resource以及它们的总和all,其中对select、update、insert可指定(属性列表)

      • with grant option表示获得权限的用户可以把权限再授予其它用户

🍃 视图的授权

  • 视图的访问会转换成实际关系的访问,所以创建视图的用户在视图上的权限,不会超越在实际关系上的已有权限

    如果在用来定义视图的关系上没有update 权限,则在视图上也没有update权限

🍃 模式的授权

  • 模式的基本授权:模式的拥有者才拥有对模式的修改权限

    如:增、删关系,增、删关系的属性,以及增、删索引。

  • references权限,允许用户在创建关系时声明外码,此权限可以授予到指定属性上(因为外码会限制其他用户对被参照关系将来的行为,所以需要授权)

    • 示例:

      grant references (dept_name) on department 
      to Mariano
      
    • 代码解读:允许Mariano创建关系能参照department的码dept_name

🍃 权限的转移

  • 用户具有权限的充分必要条件

    • 当且仅当存在从根结点到该用户结点的路径(结点是用户,根结点是DBA,有向边Ui→Uj,表示用户Ui把某权限授给用户Uj)在这里插入图片描述

🥕收权命令

  • 格式

    revoke 表级权限 on <关系名/视图名>  
    from <用户/角色列表/public,用户/角色列表,用户/角色列表,...> 
    
    • 注意:收回权限时,若该用户已将权限授予其它用户,则也一并收回。授权路径的起点一定是DBA

🍃 级联收回(默认)

收回权限时,若该用户已将权限授予其它用户,则也一并收回

🍃 restrict防止级联收回

  • 如果存在任何级联收回,返回错误,不执行任何收权动作

  • 示例

    revoke 
    select on department 
    from Amit 
    restrict
    

🍃 仅仅收回grant option,保留其他权限

  • 即只回收授权选项,不真正回收权限

  • 示例

    revoke 
    grant option for 
    select on department 
    from Amit 
    
    • 注意:一些数据库实现不支持上述语法。变通方法:收回权限;然后不带grant option重新授权

🍃 通过角色授权,避免用户授权的级联收回

  • (1)设置会话的当前角色为已定义角色:set role role_name

  • (2)由当前角色授权(角色不为空),授权语句后加:grant by current_role

🐇 权限控制命令一览

🥕概述

  • grant 和 revoke 可在几个层次上控制访问权限:

    • 整个服务器,使⽤ grant allremove all

    • 整个数据库,使⽤ on database.*

    • 特定的表,使⽤ on database.table

    • 特定的列

    • 特定的存储过程。

  • 新创建的账户没有任何权限。

    • 账户⽤ username@host 的形式定义,username@% 使⽤的是默认主机名。

    • MySQL 的账户信息保存在 mysql 这个数据库中 USE mysql ; select user from user

🥕创建账户

  • create user 用户名 identified by '密码'

🥕修改账户名

  • update user SET user='newuser' where user='myuser' flush privileges

🥕删除账户

  • drop user 用户名

🥕查看权限

  • show grants for 用户名

🥕授予权限

  • grant 权限列表 on 关系名/视图名 to 用户/角色列表

  • 常用授权命令

  • 在这里插入图片描述

🥕删除权限

  • revoke 权限列表 on 关系名/视图名 from 用户/角色列表

🥕更改密码

  • set password for 用户名 = '密码名'

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

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

相关文章

Web 应用渗透测试 00 - 信息收集

背景 这个系列写 Web 应用渗透测试相关的内容。此篇从信息收集开始&#xff0c;看一下 Web 应用端有哪些方面的信息值得渗透测试者去收集&#xff0c;能对后续的行动产生积极的影响。 Web 应用渗透测试 - 信息收集 security.txt 这个文件包含了网站的漏洞披露的联系方式。如…

Java面试题每日10问(18)

Miscellaneous Interview Questions 1. What are the advantages and disadvantages of object cloning? Advantage of Object Cloning You don’t need to write lengthy and repetitive codes. Just use an abstract class with a 4- or 5-line long clone() method.It is t…

二叉树的迭代遍历

二叉树的迭代遍历 前序遍历 基本思路 基本思路其实很简单, 使用递归遍历的时候, 一直是系统帮我们把其他数据压栈, 举个例子 > ans [5,4,6,2,1,null,null] 前序遍历的序列是: [5,4,2,1,6] , 栈的出入顺序是, 先入, 后出, 假如我们想要一个元素先出, 就要让它后入栈 基…

STC12驱动MLX90614红外测温模块在LCD1602显示

文章目录1、基本简介2、通信方式3、参考STC12例程参考文献1、基本简介 2、通信方式 通过芯片手册我们可以了解到这个模块的输出有PWM和SMBus方式&#xff0c;PWM长期做嵌入式开发的已经很熟悉了&#xff0c;那么什么是SMBus呢&#xff1f; SMBus&#xff08;系统管理总线&…

swift(3)

目录 while循环&#xff0c;repeat while循环 String基本操作 Array数组 Set集合 while循环&#xff0c;repeat while循环 import UIKitvar a0 while(a<5){print(a) }简单的while循环&#xff0c;我这一个循环下去&#xff0c;我playground直接被强制退出。 import UIK…

go的基本数据类型转换

目录 1.(整形转化)基本语法 2.小知识 3.基本数据类型和string的转换 A.fmt.Sprintf("%参数", 表达式) B. 使用 strconv 包的函数 4.string和基本数据类型转换 Go在不同类型的变量之间赋值时需要显示转换&#xff0c;不能自动转换 1.(整形转化)基本语法 A.不考…

Elasticsearch7.8.0版本高级查询—— 模糊查询文档

目录一、初始化文档数据二、模糊查询文档2.1、概述2.2、示例12.3、示例2一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan"…

LeetCode 1824. 最少侧跳次数

【LetMeFly】1824.最少侧跳次数 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-sideway-jumps/ 给你一个长度为 n 的 3 跑道道路 &#xff0c;它总共包含 n 1 个 点 &#xff0c;编号为 0 到 n 。一只青蛙从 0 号点第二条跑道 出发 &#xff0c;它想要跳到…

SpringCloud(16):Zuul网关服务整合Swagger接口文档

手写Api文档的几个痛点 文档需要更新的时候&#xff0c;需要再次发送一份给前端&#xff0c;也就是文档更新交流不及时。接口返回结果不明确不能直接在线测试接口&#xff0c;通常需要使用工具&#xff0c;比如postman接口文档太多&#xff0c;不好管理1 springcloud快速集成 …

LINUX---进程间通信(IPC)

目录进程间通信&#xff08;IPC&#xff09;介绍&#xff1a;一、管道1、特点&#xff1a;2、原型&#xff1a;父子进程中的管道应用&#xff1a;FIFO1、特点2、原型三、消息队列ftok移除消息队列四.共享内存信号信号携带消息信号量微信QQ聊天就是进程间通信&#xff08;基于网…

大数据技术之Hadoop(MapReduce)

第1章 MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个H…

StructuredStreaming Sink

StructuredStreaming Sink Output Modes append 默认追加模式, 将新的数据输出&#xff0c;只支持简单查询 complete 完整模式&#xff0c;支持聚合和排序 update 更新模式&#xff0c;支持聚合不支持排序&#xff0c;没有聚合和append一样 下面这段操作&#xff0c;有聚合…

Python机器学习数据建模与分析——Numpy和Pandas综合应用案例:空气质量监测数据的预处理和基本分析

本篇文章主要以北京市空气质量监测数据为例子&#xff0c;聚集数据建模中的数据预处理和基本分析环节&#xff0c;说明Numpy和Pandas的数据读取、数据分组、数据重编码、分类汇总等数据加工处理功能。同时在实现案例的过程中对用到的Numpy和Pandas相关函数进行讲解。 文章目录数…

新的一年即将到来,分享2023年火爆的行业和值得做的副业兼职项目

明天就是除夕啦&#xff0c;小编还在努力工作着&#xff0c;分享完这一篇文章后&#xff0c;小编也要和家人朋友们一起好好休息下&#xff0c;过一个乐此不疲的春节。今天分享的主要是对明年行业的憧憬以及一些值得做的副业兼职项目&#xff0c;文章比较长&#xff0c;如果觉得…

Spring源码学习:setter循环依赖

1.案例&#xff1a;Component public class A {private B b;Autowiredpublic void setB(B b) {this.b b;}public B getB() {return b;}public void f(){System.out.println(b);} }Component public class B {private A a;Autowiredpublic void setA(A a) {this.a a;}public v…

Ubuntu 终端美化(oh-my-zsh)

文章目录Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09;一、 环境准备二、 配置文件1、 主题2、 修改插件2.1 官方插件2.2 第三方插件Ubuntu 终端美化&#xff08;oh-my-zsh&#xff09; 一、 环境准备 这个美化教程适合于大多数的 Linux 系统&#xff0c;其实可以通用的。…

递归和分治(基础)

目录 一、递归的定义 1、什么时候会用到递归的方法 1. 定义是递归的 2. 数据结构是递归的 3. 问题的解法是递归的 2、应用递归的原则 3、递归调用顺序问题 1. 首先递归的过程可以总结为以下几点&#xff1a; 2. 递归工作栈 二、 递归和非递归的转化 1. 单向递归可…

【JavaGuide面试总结】计算机网络·下

【JavaGuide面试总结】计算机网络下1.HTTP 和 HTTPS 有什么区别&#xff1f;2.HTTP 1.0 和 HTTP 1.1 有什么区别&#xff1f;连接方式状态响应码缓存处理Host头处理带宽优化3.HTTP 是不保存状态的协议, 如何保存用户状态?4.简单说说 ARP 协议的工作原理同一局域网内的 MAC 寻址…

【Java寒假打卡】JavaWeb-ServletContext

【Java寒假打卡】JavaWeb-ServletContext概述域对象ServletContext的配置方式ServletContext的常用方法ServletContext共享数据的方法概述 ServletContext是应用上下文对象&#xff08;应用域对象&#xff09;。每一个应用中只有一个ServletContext对象作用&#xff1a;可以配…

kubernetes集群搭建问题记录

centos7 系统 内核需要升级 centos7内核升级文章 init-config.yaml文件初始化master的时候 advertiseAddress 是主机的ip地址 kubeadm kubelet kubectl 安装 1.19.0 版本&#xff0c;版本高了有问题 yum install -y kubeadm-1.19.0 kubelet-1.19.0 kubectl-1.19.0 master 和…