使用 SQL 服务器构建安全的动态查询

Constructing a safe dynamic query using SQL Server

我刚开始使用 nodejs mssql/tedious 库。我有一个 table 对列使用默认值,我不能指望日志总是具有所有这些值。我想知道是否有一种更简单的方法可以根据传递到我的日志函数的值动态地安全地构建查询。

const sql = require('mssql')
const config = require('config')

const dconfig = config.database

const addLog = async (options) => {
  const { text, sentSuccess, isError } = options
  try {
    let pool = await sql.connect(dconfig)
    let request = await pool.request()
    request.input('message', sql.Text, text.trim())
    if (sentSuccess) {
      request.input('sent', sql.Bit, !!parseInt(sentSuccess))
      await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')
    } else {
      await request.query('insert into dbo.MApp_Logs (message) values (@message)')
    }
  } catch (err) {
    throw err
  } finally {
    sql.close()
  }
}

你可以看到,在这里我被迫根据存在的值多次重写查询。有没有更优雅的方法来处理这个问题而不将值连接到字符串中?

除了向后兼容,我真的不喜欢在 SQL 中使用或依赖 DEFAULT 约束;但这是品味和偏好的问题。我希望在新工作的代码中处理您的默认值,并始终发送相同的 SQL 语句:

 request.input('message', sql.Text, text.trim())
 if (sentSuccess)
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
 else
     request.input('sent', sql.Bit, theDefaultValue)
 await request.query('insert into dbo.MApp_Logs (message, sent_success) values (@message, @sent)')

然而,如果你真的想使用SQL的默认定义,你总是可以连接sql语句并继续参数化:

 request.input('message', sql.Text, text.trim())
 let sqlFields = "insert into dbo.MApp_Logs (message"
 let sqlValues = ") values (@message"

 if (sentSuccess) {
     request.input('sent', sql.Bit, !!parseInt(sentSuccess))
     sqlFields += ", sent_success"
     sqlValues += ", @sent"
 }

 await request.query(sqlFields + sqlValues + ")")