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语句
使用存储过程的优势,提高应用程序的开发效率,降低网络访问次数