zoukankan      html  css  js  c++  java
  • 存储过程中高性能安全式SQL拼接

    不少开发人员在进行SQL拼接时头痛之极,不知道如何进行拼接操作才会更安全又不影响性能,下面我以存储过程为例与大家分享一个相对比较安全高效的方法

    简介:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

    格式
    CREATE PROCEDURE [拥有者.]存储过程名
    [(参数#1,…参数#1024)]
    [WITH
    {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
    ]
    [FOR REPLICATION]
    AS 程序行
    其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
    (SQL Server 7.0以上版本),参数的使用方法如下:
    @参数名数据类型[VARYING] [=内定值] [OUTPUT]
    案例
        需求:1、查询一张图片表中前10笔图片信息
        条件:1、按图片类型(imgtype)添加人员编号(agentID)
           2、若图片类型参数为空(NULL)查询所有类型
           3、若添加人员参数为空(NULL)查询所有人员
    下面我们来分析一下我们经常使用的两种不同写法 会带来什么样的结果有什么样的不足之处
    写法一:(不推荐)
    优势:一、阅读或写法简单符合面向过程思路,大多数程序员都喜欢
    不足:一、无法防止SQL注入问题;(防SQL注入核心方法:参数化)
       二、影响性能(这种写法参数无法确定导致每次调用时都会重新编译
       三、无法避免特殊符号的影响
     
    写法二:(不推荐)
      
    优势:1、代码量少,阅读简单
       2、防止了SQL注入问题
    不足:1、隐藏了一个定时炸弹(非常可怕的东西)
          1.1、当资料和参数为NULL时 查询条件变成了 NULL=NULL,NULL=NULL真的成立吗?
     
         现在大家应该明白原因了吧,此方法容易导致数据丢失(目前查询中的资料显示 NULL=NULL成立与否跟SQL服务器配置有关,对于这种时对时错的方式最好不用,否则找问题你会后悔死的)
       2、大数据下此写法性能非常低(丢失了索引键)
           2.1、使用存储过程原因(1、提高性能,2、安全,3、逻辑业务.....)大数据下提高查询性能(除硬件,架构..之外),建立索引是非常重要的但是写法不同
    会导致索引建丢失 分析一下:
          
    反而这种写法性能更高
    写法三:(推荐)
    优势:一、阅读或写法简单符合面向过程思路,大多数程序员都喜欢
        二、参数化解决SQL注入问题
        三、一次编译通过无需再次编译
        四、利用了索引功能(提升性能)
        五、防止了特殊符号的影响
  • 相关阅读:
    Bootstrap3 代码-代码块
    DB2 911错误的解释
    Bootstrap3 代码-用户输入
    Bootstrap3 代码-内联代码
    Bootstrap3 排版-列表
    Bootstrap3 排版-引用
    Bootstrap3 排版-地址
    Bootstrap3 排版-缩略语
    Bootstrap3 排版-改变大小写
    Bootstrap3 排版-对齐
  • 原文地址:https://www.cnblogs.com/tx720/p/5959947.html
Copyright © 2011-2022 走看看