zoukankan      html  css  js  c++  java
  • 数据库---数据控制语言(DCL)

    数据控制,其实就是“分配权限”——就涉及到用户。
    则主要就是2个问题:
      用户管理:
      权限分配:
        有哪些权限。
    mysql中的权限
    mysql中,权限是系统内定的一些“名词”(单词),大约30个,每个权限表示“可以做什么工作”。 
    则分配权限就是相当于让某个用户可以做哪些工作。
    主要权限如下:

    mysql中的用户:mysql中的用户信息都存储在系统数据库mysql的user表中。
    创建用户
    语法形式:
      create user ‘用户名’@’允许其登录的地址’ identified by ‘密码’;
    说明:
      1,创建的用户需同时指定该用户可以在哪个地址进行登录
        其中“%”代表“任何地址”。
      2,用户创建之后,自动在mysql的user表中添加了一条记录,但该用户还没有权限

    删除用户
      drop user ‘用户名’@’允许其登录的地址’;

    修改用户密码
      修改自己密码: set password = password(‘新密码’);
      修改他人密码(必须有修改权限):
        set password for ‘用户名’@’允许其登录的地址’ = password(‘新密码’);

    权限分配
    增加权限:
      grant 权限名1,权限名2, .... on 数据库名.对象名 to ‘用户名’@’允许其登录的地址’ identified by ‘密码’;
    说明:
      1权限名就是:’select’, ‘update’, ‘delete’,等等。其中ALL 表示“所有权限”,或all privileges也一样
      2对象名:就是一个数据库中“装”的东西,表是最常见的,也可以是视图,存储过程,存储函数等。
        其中:*.*表示所有数据中的所有对象
        某数据库名.*表示该数据库中的所有对象——这个商业上常用。
      3,identified by ‘密码’用于给一个用户在此时修改密码,不写也可以,那就不修改密码
      4,但同时该语句也可以创建用户(如果不存在),但此时identified by ‘密码’必须写。

    删除权限
      revoke 权限名1,权限名2, .... on 数据库名.对象名 from ‘用户名’@’允许其登录的地址’ ;
    表示从某个用户身上“取消”某些权限(也许还保留了其他权限)。

    事务控制语言(DTL)
    什么是事务
    通常,在此之前,我们说,一条语句使用一个分号(;)来结束,并得到执行。
    那么我们说,这个“一次性执行”的过程,可以称为“一个事务”。
    简单来说,“一条sql语句,就是一个事务”。
    则:
    数据库(自然包括mysql数据库)中的事务,是指,可以将“多条语句”的执行,当作“一条语句”来看到的一种内部机制。
    即:“事务”是一种可以保证“多条语句一次性执行完成”或“一条都不执行”的机制。
      事务可以看作是一个“容器”,将多条语句,放入该容器,最后,只要一个命令行,来决定其中的所有语句是否“执行”


    事务的特点
      原子性:一个事务中的所有语句,应该做到:要么全做,要么一个都不做;
      一致性:让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;
      隔离性:如果多个事务同时并发执行,但每个事务就像各自独立执行一样。
      持久性:一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

    事务模式:就是让每条执行语句是否当作“一个事务”来看到的设定项。

    mysql默认安装好之后,其事务模式是:一条语句当作一个事务。
    事务的基本实现流程:
      1,声明事务开始:start transaction;
      2, 设定多条要执行的具体语句,比如:insert, update, delete, select。。。其实就是执行,只是这些执行的语句,并不“生效”——其只是内存状态下的执行,而不是物理状态的执行。

    3,判断是否需要执行该些语句:
        if( 判断是否有错误){
            //执行——才针对执行了物理性改变——即生效。
            commit;
        }
        eslse{
            //回滚——不执行任何语句。
            rollback;
        }            

    判断是否有错误通常分这两种环境:
      1,如果是cmd中,直接观察是否出错。
      2,如果是php程序中,那就需要使用 mysql_error()函数来判断是否有错。
    一个事务有多条语句,如果全部正确,则commit,如果有其中任意一条或一条以上发生错误,则rollback;

    mysql编程
    基本语法形式
    语句块模式:

    在mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法。
    但又有所区别:
        一个bigin...end;块,可以给定一个“标识符”,并且可以使用leave语句来“退出”该语句块。
    基本流程控制语句:
    if语句:

    case语句:(类似php中的switch)

    while循环语句:

    mysql中的变量
    变量它有一定的使用场景限制(其实包括前面的流程控制语句也这样):
    在通常的执行各种create,insert,delete,update,select等语句的“环境”中,并不使用常规变量,也不能使用流程控制语句。
    其实,这些语句只能在编程环境中用——通常的增删改查,可以称为命令环境。
      常规mysql命令环境,可以执行:增删改查
      编程环境:存储函数中,存储过程中,触发器中。
    普通变量的声明语法:
      declare 变量名 变量类型 [default 初始值]
    变量的赋值语法:
      set 变量名 = 变量值
     mysql还有一种变量形式,可以称为“会话变量”
    会话变量的形式为: @变量名;
    会话变量无需单独声明,而是直接赋值就可以,类似php
    会话变量的赋值: set 变量名 = 值;
    会话变量可以在普通命令行环境中或编程环境中使用。

    综上所述:   语法1:set 变量名 = 表达式;#此语法中的变量必须先使用declare声明
          语法2:set @变量名 = 表达式; #此方式可以无需declare语法声明,而是直接赋值,类似php定义变量并赋值。
          语法3:select @变量名 := 表达式;#此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”
          语法4:select 表达式 into @变量名;#此语句虽然看起来是select语句,但其实并不输出“结果集”而只是给变量赋值。

    总结---两种变量:
      普通变量:不带@符,直接写名字,必须先声明,后使用(赋值之类),只能用于编程环境
      会话变量:带@符,无需声明,直接使用(先赋值),可以用于2种环境。

    存储函数
    调用形式:
      跟系统函数的调用形式一样,直接使用名字,并带括号,以及根据需要带实参。
    比如:
      select 3, now(), f1(); //f1为自定义的存储函数。
      select 3, now(), f2(3, ‘abc’, @v1); //带3个实参,其中@v1是一个前面赋值了的变量。
    删除:drop function [if exists] 存储函数名;
    存储过程
      存储过程就是一个没有返回值数据值的“函数”。
      虽然存储过程不返回单个数据值,但可以“返回”结果集——这里的返回起始就是select语句的正常结果表现。
    定义形式:

    其中,
      in,out,inout用于修饰一个形参的“数据流向”:
      in:只作为外部输入数据,调用环境传入存储过程内部,默认值。
      out:只作为输出数据,即存储过程传出到调用环境。
      inout:具有双重。
    存储过程调用形式:
      call 存储过程名(实参1,实参2,.....);

    删除:drop procedure [if exists] 存储过程名;


    触发器
    什么叫触发器:
      就是mysql中的一种“一触即发”的机器(机制)。
    其实只是预先定义好的一段代码。该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行。
    通常就这几个情形:
      对某个数据表的增(或删或改)之前(或之后)。 //每个表可见只有6种情形

    触发器内部也跟存储过程或存储函数一样,属于“编程环境”。
    定义形式:

    create trigger 触发器名字 before(或after) insert(或update或delete) on 表名 for each row 
    begin
        要执行的代码,语句块,编程环境,但这里也不能使用select语句。
    end

    在触发器内部,其中有两个关键字具有特定含义和数据获取作用:
      new:代表新插入的一条数据,在insert事件的时候有效。
      old:代表旧的一条数据,在update或delete的时候有效。

    删除触发器: drop trigger 触发器名

  • 相关阅读:
    基于ArcGIS10.0和Oracle10g的空间数据管理平台十一(C#开发)空间数据字段检查
    IT技术人生路之我的大学网站开发技术团队
    分布式日志收集系统: Facebook Scribe
    基于ArcGIS10.0和Oracle10g的空间数据管理平台十(C#开发)空间数据导入RDBMS上MDB格式
    IT技术人生路之我的大学初入大学及军训
    IT技术人生路之我的大学我技术方向的转变
    基于ArcGIS10.0和Oracle10g的空间数据管理平台十三(C#开发)空间数据导出
    基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)系统需求分析
    web服务
    js数据转换
  • 原文地址:https://www.cnblogs.com/1301694f/p/8452674.html
Copyright © 2011-2022 走看看