zoukankan      html  css  js  c++  java
  • 视图,sql注入问题,事物,存储过程

    视图:
    本质是一张虚拟的表
    数据来自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 ;

  • 相关阅读:
    Tomcat域名绑定
    Windows下搭建PHP开发环境
    创业项目该如何选择技术?
    linux mount 挂接新硬盘
    Linux 查看系统硬件信息
    this super的用法
    构造方法
    多态
    抽象类和接口
    继承
  • 原文地址:https://www.cnblogs.com/fushaunglin/p/9671220.html
Copyright © 2011-2022 走看看