MySQL第43天------视图、SQL注入问题、事务、存储过程

一、视图

  定义:本质是一张虚拟的表,数据来自select语句

  用途:原表安全  1.隐藏部分数据,开放指定的数据  2.因为视图可以将查询的结果保存特性,所以可以用视图来减少书写sql语句的次数

  创建:create view test_view as select *from t1;

  特点:1.每次对视图进行的查询,其实都是再次执行了as后面的查询语句

     2.可以对视图进行修改,修改会同步到原表

     3.视图是永久储存的,存储的不是数据,而是一条as sql语句

二、sql注入问题

当用户输入的用户名为字符串 为 yy' -- 时
最终产生的sql select *from user where user = 'yy' -- ' and pwd = '987657890';
-- 用于mysql注释 意思是 后面的内容忽略掉
从而导致 密码是否正确都能登录成功
"select *from user where user = 'axxax' or 1=1;

什么是sql注入攻击

一些了解sql语法的 用户 可以输入一些关键字 或合法sql 来导致原始的sql逻辑发生变化 从而跳过登录验证 或者 删除数据库
如何避免 在接受用户输入的数据时 可以加上限制 比如 不能输 -- ' ; where 等等
上面这种方式 只能避免 黑客 从你的客户端软件注入 sql
但是无法避免 中间人攻击(在你的客户端和服务器中间加一个中转服务器)
这样就绕过了客户端的输入限制 此时 只能将 sql合法性验证放在服务器端

总结:把你的sql(用户输入的)参数,放execute函数的arg参数中,让pymysql自动帮你屏蔽注入攻击

三、事务

  定义:一组sql语句集合

  特性:1.原子性:事务是一个整体,不可分割

     2.隔离性:事务之间要相互隔离,为了维护数据完整性

          脏读:一个事务读到了另一个事务未提交的数据。查询之前要保证所有的更新都已经完成

          幻读:一个查询事务没有结束的时候,数据被另一个数据执行插入或查询

          不可重复读:一个事务在查询另一个事务的时候,另一个事务在修改

            四种隔离级别:读未提交、读已提交、可重复读(默认)、串行化

     3.一致性:当事务执行后,所有的数据都是完整的

     4.持久性:一旦事务提交,数据就永久保存

  强调:事务就是一堆sql语句的集合,要么全部执行,要么全部不执行

     mysql默认开启自动提交,一条sql语句就是一个单独的事务

     pymysql默认不是自动提交,需要手动commit,意思是手动开启了事务

  start transaction开启一个事务

  commit提交事务

  rollback回滚事务

四、存储过程

  定义:mysql的编程语言

  用途:可以将你的程序业务逻辑放到mysql里来处理,可以降低网络访问次数,从而提高程序的效率

  开发模式:1.应用程序处理逻辑,需要手动编写sql语句  优点:执行效率高  缺点:开发效率低

       2.应用程序mysql处理逻辑,mysql开发者编写  优点:应用程序开发效率高  缺点:执行效率略低,沟通成本高

       3.使用ORM对象关系映射,自动生成对应的sql语句  优点:开发效率很高  缺点:执行效率低

  语法:create procedure 过程的名称 ({in,out,inout} 数据类型 参数名称)

     begin 具体的sql代码 end 参数前面需要指定参数的作用

     in 表示该参数用于传入数据

     out 用于返回数据

     inout 即可传入,也可返回

  总结:实际上一个mysql中的类似函数的东西,我们可以用它实现一些逻辑处理

     特点:里面可以包含流程控制语句和普通的sql语句

        使用存储过程的优势,提高应用程序的开发效率,降低网络访问次数

原文地址:https://www.cnblogs.com/zhouyi0316/p/9671287.html