【问题标题】:Actual SQL statement after bind variables specified指定绑定变量后的实际 SQL 语句
【发布时间】:2011-06-09 07:10:30
【问题描述】:

我正在尝试记录从我的脚本执行的每个 SQL 语句。然而,我想到了一个我无法克服的问题。

有没有办法在指定绑定变量后计算实际的 SQL 语句。在 SQLite 中,我必须使用以下代码计算要手动执行的语句:

def __sql_to_str__(self, value,args):
    for p in args:
        if type(p) is IntType or p is None:
            value = value.replace("?", str(p) ,1)
        else:
            value = value.replace("?",'\'' + p + '\'',1)
    return value

CX_Oracle 似乎有 cursor.parse() 功能。但我不知道如何欺骗 CX_Oracle 在执行之前计算我的查询。

【问题讨论】:

    标签: python sql oracle cx-oracle


    【解决方案1】:

    查询从不计算为单个字符串。查询的实际文本和参数从不插值,并且生成真正的完整字符串。

    这就是使用参数化查询的全部意义 - 将查询与数据分开 - 一次性防止 sql 注入和限制,并允许轻松优化查询。数据库分别获取两者,并执行它需要做的事情,而无需将它们连接在一起。

    也就是说,您可以自己生成查询,但请注意,您生成的查询虽然可能等效,但并不是在数据库上实际执行的查询。

    【讨论】:

    • 我只是不同意你的数据注入点。人们可以注入整个该死的查询,因为它本质上是动态的。否则,非常感谢您结束这个主题。
    • @bioffe:嗯,这就是程序员进入的地方——通过开发仅具有静态查询和参数化属性的应用程序,您可以避免注入并大大加快应用程序的速度,因为 Oracle 会缓存预编译的查询,如果文字是一样的。
    • 如果你有一个动态的实体对象组合是很难实现的。我知道框架提供商应该解决安全问题,但他们总是让客户对实体组合和持久性进行更精细的低级控制。
    【解决方案2】:

    最好的办法是在数据库服务器上执行此操作,因为正确实现的 Oracle 连接器不会在将查询发送到服务器之前将绑定变量放入字符串中。看看你是否能找到一个 Oracle 服务器设置,让它记录它执行的查询。

    【讨论】:

      【解决方案3】:

      您可能需要考虑为此使用 Oracle 的扩展 SQL 跟踪功能。我建议从这里开始:http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多