Mysql 有比使用存储过程更好的方法吗? 请考虑下面的代码,我用它来获得SDENGRADE发布的数据。 <cftry> <cfset incomingData = toString(getHttpRequestData().content) /> <cfset djs = DeserializeJSON(incomingData)/> <cfset a = "0"> <cfset b = ""> <cfset c = "0"> <cfset d = "0"> <cfset e = ""> <cfset f = ""> <cfset g = ""> <cfset h = ""> <cfset i = ""> <cfset k = "#NOW()#"> <cfset l = ""> <cfset m = ""> <cfset n = ""> <cfoutput> <cfloop from="1" to="#arraylen(djs)#" index="i"> <cfset a = "0"> <cfset b = ""> <cfset c = "0"> <cfset d = "0"> <cfset e = ""> <cfset f = ""> <cfset g = ""> <cfset h = ""> <cfset i = ""> <cfset k = "#NOW()#"> <cfset l = ""> <cfset m = ""> <cfset n = ""> <cfif StructKeyExists(djs[i],'p')> <cfset a = djs[i].p /> </cfif> <cfif StructKeyExists(djs[i],'q')> <cfset b = djs[i].q /> </cfif> <cfif StructKeyExists(djs[i],'r')> <cfset c = djs[i].r /> </cfif> <cfif StructKeyExists(djs[i],'s')> <cfset d = djs[i].s /> </cfif> <cfif StructKeyExists(djs[i],'t')> <cfset e = djs[i].t /> </cfif> <cfif StructKeyExists(djs[i],'u')> <cfset f = djs[i].u /> </cfif> <cfif StructKeyExists(djs[i],'v')> <cfset g = djs[i].v /> </cfif> <cfif StructKeyExists(djs[i],'w')> { <cfset i = djs[i].w /> <cfset k = dateAdd("s", i, createDateTime(1970, 1, 1, 0, 0, 0))/> } </cfif> <cfif StructKeyExists(djs[i],'x')> <cfset l = djs[i].x /> </cfif> <cfif StructKeyExists(djs[i],'y')> <cfset m = djs[i].y /> </cfif> <cfif StructKeyExists(djs[i],'z')> <cfset n = djs[i].z /> </cfif> <cfstoredproc procedure="sp1" datasource="db1"> <cfprocparam cfsqltype="cf_sql_bigint" value="#a#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(b,199)#"> <cfprocparam cfsqltype="cf_sql_integer" value="#c#"> <cfprocparam cfsqltype="cf_sql_integer" value="#d#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(e,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(f,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(g,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(h,199)#"> <cfprocparam cfsqltype="cf_sql_timestamp" value="#k#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(l,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#LEFT(m,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(n,99)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="XX.XX.X.XX"> </cfstoredproc> <cfstoredproc procedure="sp2" datasource="db2"> <cfprocparam cfsqltype="cf_sql_bigint" value="#a#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(b,199)#"> <cfprocparam cfsqltype="cf_sql_integer" value="#c#"> <cfprocparam cfsqltype="cf_sql_integer" value="#d#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(e,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(f,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(g,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(h,199)#"> <cfprocparam cfsqltype="cf_sql_timestamp" value="#k#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(l,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#LEFT(m,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(n,99)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="XX.XX.X.XX"> </cfstoredproc> </cfloop> </cfoutput> </cftry> { }

Mysql 有比使用存储过程更好的方法吗? 请考虑下面的代码,我用它来获得SDENGRADE发布的数据。 <cftry> <cfset incomingData = toString(getHttpRequestData().content) /> <cfset djs = DeserializeJSON(incomingData)/> <cfset a = "0"> <cfset b = ""> <cfset c = "0"> <cfset d = "0"> <cfset e = ""> <cfset f = ""> <cfset g = ""> <cfset h = ""> <cfset i = ""> <cfset k = "#NOW()#"> <cfset l = ""> <cfset m = ""> <cfset n = ""> <cfoutput> <cfloop from="1" to="#arraylen(djs)#" index="i"> <cfset a = "0"> <cfset b = ""> <cfset c = "0"> <cfset d = "0"> <cfset e = ""> <cfset f = ""> <cfset g = ""> <cfset h = ""> <cfset i = ""> <cfset k = "#NOW()#"> <cfset l = ""> <cfset m = ""> <cfset n = ""> <cfif StructKeyExists(djs[i],'p')> <cfset a = djs[i].p /> </cfif> <cfif StructKeyExists(djs[i],'q')> <cfset b = djs[i].q /> </cfif> <cfif StructKeyExists(djs[i],'r')> <cfset c = djs[i].r /> </cfif> <cfif StructKeyExists(djs[i],'s')> <cfset d = djs[i].s /> </cfif> <cfif StructKeyExists(djs[i],'t')> <cfset e = djs[i].t /> </cfif> <cfif StructKeyExists(djs[i],'u')> <cfset f = djs[i].u /> </cfif> <cfif StructKeyExists(djs[i],'v')> <cfset g = djs[i].v /> </cfif> <cfif StructKeyExists(djs[i],'w')> { <cfset i = djs[i].w /> <cfset k = dateAdd("s", i, createDateTime(1970, 1, 1, 0, 0, 0))/> } </cfif> <cfif StructKeyExists(djs[i],'x')> <cfset l = djs[i].x /> </cfif> <cfif StructKeyExists(djs[i],'y')> <cfset m = djs[i].y /> </cfif> <cfif StructKeyExists(djs[i],'z')> <cfset n = djs[i].z /> </cfif> <cfstoredproc procedure="sp1" datasource="db1"> <cfprocparam cfsqltype="cf_sql_bigint" value="#a#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(b,199)#"> <cfprocparam cfsqltype="cf_sql_integer" value="#c#"> <cfprocparam cfsqltype="cf_sql_integer" value="#d#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(e,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(f,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(g,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(h,199)#"> <cfprocparam cfsqltype="cf_sql_timestamp" value="#k#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(l,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#LEFT(m,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(n,99)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="XX.XX.X.XX"> </cfstoredproc> <cfstoredproc procedure="sp2" datasource="db2"> <cfprocparam cfsqltype="cf_sql_bigint" value="#a#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(b,199)#"> <cfprocparam cfsqltype="cf_sql_integer" value="#c#"> <cfprocparam cfsqltype="cf_sql_integer" value="#d#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(e,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(f,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(g,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(h,199)#"> <cfprocparam cfsqltype="cf_sql_timestamp" value="#k#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(l,199)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#LEFT(m,499)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="#left(n,99)#"> <cfprocparam cfsqltype="cf_sql_varchar" value="XX.XX.X.XX"> </cfstoredproc> </cfloop> </cfoutput> </cftry> { },mysql,stored-procedures,coldfusion,coldfusion-9,sendgrid,Mysql,Stored Procedures,Coldfusion,Coldfusion 9,Sendgrid,如上所述,我的代码依赖于MySQL数据库上的存储过程。我正在考虑摆脱存储过程,并找到一种不同的方法,在这种方法中,我可以在没有任何存储过程的情况下完成我想要的任务。除了使用存储过程将传入数据存储到数据库中之外,还有更好的方法吗?除了使用存储过程将传入数据存储到数据库中之外,还有更好的方法吗数据库不,不是真的。一个更好的问题是,为什么您觉得有必要停止使用存储过程 在与数据库交互时,实际上只有三个选项;存储过程、在线查询(参数化)或对象关系映射(ORM)。当然,您可以用内嵌查询或ORM替换存储过程调

如上所述,我的代码依赖于MySQL数据库上的存储过程。我正在考虑摆脱存储过程,并找到一种不同的方法,在这种方法中,我可以在没有任何存储过程的情况下完成我想要的任务。除了使用存储过程将传入数据存储到数据库中之外,还有更好的方法吗?

除了使用存储过程将传入数据存储到数据库中之外,还有更好的方法吗数据库不,不是真的。一个更好的问题是,为什么您觉得有必要停止使用存储过程

在与数据库交互时,实际上只有三个选项;存储过程、在线查询(参数化)或对象关系映射(ORM)。当然,您可以用内嵌查询或ORM替换存储过程调用,但我认为您不会真正获得任何好处

使用存储过程而不是在线查询的一些好处是:

  • 减少服务器/客户端网络流量
    过程中的命令作为一批代码执行。这可以显著减少服务器和客户端之间的网络流量,因为只有执行过程的调用通过网络发送。如果没有过程提供的代码封装,每一行代码都必须穿越网络

  • 更强的安全性
    多个用户和客户端程序可以通过一个过程对底层数据库对象执行操作,即使这些用户和程序对这些底层对象没有直接权限。该过程控制执行哪些过程和活动,并保护底层数据库对象。这消除了在单个对象级别授予权限的要求,并简化了安全层。

    可以在CREATE PROCEDURE语句中指定EXECUTE AS子句,以允许模拟其他用户,或允许用户或应用程序执行某些数据库活动,而无需对底层对象和命令具有直接权限。例如,某些操作(如TRUNCATE TABLE)没有可授予的权限。若要执行TRUNCATE TABLE,用户必须对指定的表具有ALTER权限。授予用户对表的ALTER权限可能并不理想,因为用户实际上拥有的权限远远超出了截断表的能力。通过将TRUNCATE TABLE语句合并到模块中并指定该模块作为有权修改该表的用户执行,您可以将截断该表的权限扩展到授予该模块执行权限的用户。

    通过网络调用过程时,只有执行过程的调用可见。因此,恶意用户无法查看表和数据库对象名称、嵌入自己的Transact-SQL语句或搜索关键数据。

    使用过程参数有助于防范SQL注入攻击。由于参数输入被视为文字值,而不是可执行代码,因此攻击者更难将命令插入过程中的Transact-SQL语句中,从而破坏安全性。

    过程可以加密,这有助于混淆源代码。有关详细信息,请参阅SQL Server加密

  • 代码的重用
    任何重复数据库操作的代码都是过程中封装的完美候选。这消除了对相同代码的不必要重写,减少了代码不一致性,并允许拥有必要权限的任何用户或应用程序访问和执行代码

  • 更易于维护
    当客户机应用程序调用过程并将数据库操作保留在数据层中时,只需更新过程以应对基础数据库中的任何更改。应用层保持独立,不必知道如何更改数据库布局、关系或进程

  • 性能改进
    默认情况下,过程在第一次执行时进行编译,并创建一个执行计划,供后续执行时重用。由于查询处理器不必创建新的计划,因此处理该过程所需的时间通常较短。 如果过程引用的表或数据发生了重大更改,预编译计划实际上可能会导致过程执行较慢。在这种情况下,重新编译过程并强制执行新的执行计划可以提高性能

其中一些特定于SQL Server,但大多数适用于任何数据库

除了使用存储过程将传入数据存储到数据库中之外,还有更好的方法吗?不,不是真的。一个更好的问题是,为什么您觉得有必要停止使用存储过程

在与数据库交互时,实际上只有三个选项;存储过程、在线查询(参数化)或对象关系映射(ORM)。确实可以用in替换存储过程调用吗-