节点JS mssql / mssqlnodev8当用户为DBOwner时,INSERT权限被拒绝

时间:2016-09-21 05:40:26

标签: sql-server node.js sql-server-2012 windows-server-2012-r2 node-mssql

我正在运行一个非常简单的节点js应用程序,用于跟踪给定网站上的用户点击量。开发版本可以很好地写入SQL 2012 Enterprise Server,但生产版本出现以下错误:

error running query { RequestError: The INSERT permission was denied on the object 'StudentMonitor', database 'LearnOnlineStatus', schema 'dbo'.
    at StreamEvents.<anonymous> (C:\Node\MoodleMonitor\node_modules\mssql\lib\msnodesqlv8.js:624:21)
    at StreamEvents.g (events.js:286:16)
    at emitOne (events.js:96:13)
    at StreamEvents.emit (events.js:188:7)
    at routeStatementError (C:\Node\MoodleMonitor\node_modules\msnodesqlv8\lib\driverMgr.js:119:20)
    at onInvoke (C:\Node\MoodleMonitor\node_modules\msnodesqlv8\lib\driverMgr.js:476:17)
    at onQuery (C:\Node\MoodleMonitor\node_modules\msnodesqlv8\lib\driverMgr.js:157:17) name: 'RequestError',   message: 'The INSERT permission was denied on the object \'StudentMonitor\', database \'LearnOnlineStatus\', schema \' dbo\'.',   code: 'EREQUEST',   number: 229,   lineNumber: undefined,   state: '42000',   class: undefined,   serverName: undefined,   procName: undefined }

尝试执行以下INSERT代码:

mssql.getConnection(function(err, client, done) {
    for (var i = 0; i < 7; i++) {
      client.input('' + (i+1), data[i]);
    }

    client.query('INSERT INTO [dbo].[StudentMonitor] (time_created, user_id, ip, url, duration, page_title, course_id) VALUES (@1, @2, @3, @4, @5, @6, @7)', function(err, result) {
      if(err) {
        console.error('error running query', err);
      }
      // return the client to the connection pool for other requests to reuse
      done();

      return typeof callback === 'function' ? callback(err, result) : result;
    });
  });

配置中列出的所有凭据都是正确的,我们已将网络问题排除为症状。通过SQL Manager尝试插入语句可以正常使用这些凭据。

让我感到沮丧的是,选择工作正常,我们使用的用户帐户是DBOwner,所以应该没有任何问题。在SQL中检查表显示没有奇怪的权限或触发器,它只是一个普通的旧表。

目前在两台Windows 2012(64位)R2服务器上运行,但两者的行为相同。已安装SQL Native Client 11.0,并且我已添加并删除了ODBC客户端而没有任何影响。凭据通过mssql.conf文件设置,该文件都是正确的,并从控制台日志中确认。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,使用trustedConnection:true与mssql(lib / mssql.js)的东西,所以它使用我的凭据而不是提供的凭据。将其切换为false并添加用户和密码已解决了该问题。