视图,sql注入问题,事物,存储过程

时间:2022-09-12 20:01:32

视图:
本质是一张虚拟的表
数据来自select语句
用途是保障原表安全

功能1:隐藏部分数据,开放指定数据
功能2:因为视图可以将查询结果保存的特性,我们可以用视图来达到减少书写sql语句的功能

例如:
select * from emp where dep_id=(select id from where name='市场');
要查询市场的人,可以将查询市场id的结果作为一个视图,以后再使用这个结果就可以直接查看视图

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

视图的特点:
1.每次对视图进行的查询其实都是再次执行了as后面的查询语句
2.每次对视图进行修改,修改的这个操作会同步到原表
3.视图是永久储存的,但是储存的不是数据,而是一条as sql语句

sql注入问题:

sql="select * from user where name='%s' and pwd ='%s';"%(input('请输入用户名'),input('请输入密码'))

当用户输入的用户名为yy' -- 时,密码被注释掉了,--代表注释的意思
如果使用xxx' or 1=1 这个时候用户名和密码都被忽略掉了

python 避免sql注入:

res=cursor.execute("select *from emp where name=%s and pwd=%s;",args(input('请输入用户名'),input('请输入密码')))

事物:
在mysql中事物是一组sql语句的集合

事物的特性:1.原子性,即事物是一个整体,不可再分割
2.隔离性:事物之间需要相互隔离,维护数据的完整性

事物有4中隔离级别:
读未提交
读已提交
可重复读 默认
串行化

事物就是一堆sql语句的集合,他们是原子性的,要么全部执行,要么全部都不执行

mysql这个客户端默认开启了自动提交,一条sql语句就是一个单独的事物

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

start transaction:开启一个事物
commit:提交事物
rollback:回滚

存储过程:
1 存储过程
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

02 三种开发模型
1、
应用程序:只需要开发应用程序的逻辑
mysql:编写好存储过程,以供应用程序调用

优点:开发效率,执行效率都高
缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差

2、
应用程序:除了开发应用程序的逻辑,还需要编写原生sql
mysql:

优点:比方式1,扩展性高(非技术性的)
缺点:
1、开发效率,执行效率都不如方式1
2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题

3、
应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
mysql:

优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
缺点:执行效率连方式2都比不过

03 创建存储过程

delimiter $$
create procedure p1(
in m int,
in n int,
out res int
)
begin
select tname from teacher where tid > m and tid < n;
set res=0;
end $$
delimiter ;

# 如何用存储过程
#1、直接在mysql中调用
set @res=10
call p1(2,4,10);
#查看结果
select @res;

#2、在python程序中调用

#3、事务的使用
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;

DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;

START TRANSACTION;
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;

-- SUCCESS
set p_return_code = 0; #0代表执行成功

END //
delimiter ;

delimiter //
create PROCEDURE p6(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;

DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;

START TRANSACTION;
update user set balance=900 where id =1;
update user set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;

-- SUCCESS
set p_return_code = 0; #0代表执行成功

END //
delimiter ;