① Mysql怎么确定储存过程是预编译的比普通sql执行的快
SET @update_stmt='' /*在单引号中间填入要执行的sql语句*/
PREPARE stmt FROM @update_stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
② sql server 2000预编译问题
预编译需要设置c编译器和引用lib的环境变量。给你一个教程看看。
http://www.ccf-dbs.org.cn/idke/xfmeng/course/Introction%20to%20Database%20System/2005ppt/exp3(3)tian%20chao%20huangwei.doc
③ 预编译SQL语句的使用问题
void setString(int parameterIndex,
String x)
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。
2、传递 IN 参数
在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。
如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。
利用 pstmt(前面创建的 PreparedStatement 对象),以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述,为做到这一点,数据库不能关闭 pstmt。在该示例中,第一个参数被设置为 "Hi"并保持为常数。在 for 循环中,每次都将第二个参数设置为不同的值:从 0 开始,到 9 结束。
pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}
④ SQL注入的防范 使用预编译语句
预编译语句PreparedStatement是 java.sql中的一个接口,继承自Statement 接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由 DBMS先进行编译后再执行。而预编译语句和Statement不同,在创建PreparedStatement对象时就指定了SQL语句,该语句立即发送给DBMS进行编译,当该编译语句需要被执行时,DBMS直接运行编译后的SQL语句,而不需要像其他SQL语句那样先将其编译。引发SQL注入的根本原因是恶意用户将SQL指令伪装成参数传递到后端数据库执行。作为一种更为安全的动态字符串的构建方法,预编译语句使用参数占位符来替代需要动态传入的参数,这样攻击者无法改变SQL语句的结构,SQL语句的语义不会发生改变,即便用户传入类似于前面' or '1'='1这样的字符串,数据库也会将其作为普通的字符串来处理。
⑤ SQL注入预编译是绝对安全的么
没错,存储过程的确能有效解决SQL注入式攻击!
理由:因为通常的数据库访问方法,都是把访问数据表的权利赋给程序,注入式攻击者通过你的程序漏洞判断和获得更多的信息,并利用你赋给程序的访问和操作权,轻者破坏本表数据,重者毁坏整个数据库!
使用存储过程则完全不同,程序中不必再有SQL语句,因此程序不必拥有访问和操作数据表的权限,只把运行存储过程的权限交给程序。程序只是把参数和存储过程名告诉数据库,然后等待结果就行了,注入式攻击者要想运行存储过程,就必需猜对存储过程名,并且还要猜对参数个数、参数名和参数的顺序,同时满足这些条件太难了,即便所以条件都满足,那么攻击者也只是往数据表里存了一组合法数据而已,不会导致其它破坏。
因此,通过存储过程能从根本上解决注入式攻击。
需要注意的是,使用存储过程后,应把原来交给程序的操作数据表的权限收回,否则就象为了防小偷锁了前门,却开着后门一样。
⑥ 关于预编译SQL语句 帮忙看一下对不对啊
sql注入怎么回事:说白了就是在一个单引号上做文章,你把单引号转义就没啥问题了,预编译就是把这些字符转义后插入,其中包括单引号。
这段可以防止.
⑦ sql 存储过程中本地临时表的生存周期
你的理解稍微有点偏差
局部临时表只局限于创建进程以及创建进程的子进程
那么将存储过程看作是一个进程1,而exec(@sql)则是另一个进程2
根据我上面说的,#temp只会作用于创建它的进程2中
那么要想使#temp贯穿整个存储过程,则需要在存储过程中先用create table #temp来创建这个临时表,这样这个临时表的创建者就升级成了进程1,其他的无论进程2、进程3都是进程1的子进程,这样就都能引用到#temp,此时进程2中的语句就要改写成insert into而不是select into了
不过这个前提是你已知晓表结构,可以固定的创建临时表
否则你只能用exec(@sql)的形式将整个存储过程体都以拼接的方式执行
也就是不通过临时表,直接用exec(@sql)将查询结果输出
⑧ ps.executeUpdate(); 是什么意思
是当成功插入数据到数据库时候,这个会返回一个大于1的数字,来表明数据成功插入库之中
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入,采用jdbc操作数据时候,preparedStatement 预编译对象会对传入sql进行预编译。
那么当传入id 字符串为 "update ft_proposal set id = 3;drop table ft_proposal;" 这种情况下就会导致sql注入删除ft_proposal这张表。
预编译语句
处理使用预编译语句之外,另一种实现方式可以采用存储过程,存储过程其实也是预编译的,存储过程是sql语句的集合,将所有预编译的sql语句编译完成后,存储在数据库上。
当传入的参数为3;drop table user;当执行时可以看见打印的sql语句为:select name from usre where id = ?;不管输入何种参数时,都可以防止sql注入,因为mybatis底层实现了预编译。
⑨ java sql语句问题
SQL预编译.
比如
StringcusId="10101";
Stringsql2="select*fromv_userwhereuserid=?";//问号表示一个参数,
PreparedStatementpstmt2=conn.prepareStatement(sql2);
pstmt2.setInt(1,cusId);//把cusId的值替换到sql2的第一个问号
当调用数据库 执行查询的时候, 数据库会先编译SQL语句,然后执行. 预编译的作用就是,当你第二次传同一个SQL的时候数据库就不需要编译了,直接找出之前编译过的结果,然后把参数动态放进去执行.
⑩ sql预编译语句就是不执行,怪怪的,求解,急~~
你上面的语句是传参数查询吗?应该是参数没有传进去,下面的语句语法没有错误,但是可以返回的查询结果不是正确的.建议写成封装的,不易SQL注入.
比如:
public DataTable SelectAId(pb_list_of_value prep )
{
sql = "SELECT tstand_code from pb_list_of_value where display_value=@display_value and type =@type order by display_value desc ";
sqlpar = new List<SqlParameter>();
sqlpar.Add(newSqlParameter("@display_value",pb_list_of_value.display_value));
DataTable ds=DBHepler.SQLDBHepler.Search(sql,sqlpar,CommandType.Text);
return ds;
}
加粗部分不换行