我正在运行一个非常简单的节点 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 管理器尝试插入语句适用于这些凭据。
让我大吃一惊的是,选择工作得很好,而且我们使用的用户帐户是 DBOwner,所以应该没有任何问题。检查 SQL 中的表没有发现奇怪的权限或触发器,它只是一个普通的旧表。
目前在两台 Windows 2012(64 位)R2 服务器上运行,但两者的行为相同。安装了 SQL Native Client 11.0,我添加和删除了 ODBC 客户端,没有任何影响。凭据是通过 mssql.conf 文件设置的,该文件完全正确并从控制台日志中确认。有任何想法吗?