我像往常一样设置了与Azure SQL数据库关联的Azure移动服务(AMS)。但是,当我尝试使用自定义API来查询具有自定义API mssql
对象的另一个表(不是移动服务表)时,我收到权限错误:
错误:[Microsoft] [SQL Server Native Client 10.0] [SQL Server]用户'zwxABOesblahblahHYzLogin'登录失败。
有些注意事项:
AMS api脚本非常基础:
exports.get = function(request, response) {
var mssql = request.service.mssql;
var sql = "select * from abc.TestTable";
mssql.query(sql, {
success : function(results) {
console.log("Results from SQL Query to TestTable:\n"+results);
response.send(statusCodes.OK, results);
},
error: function(err) {
console.log("Error in SQL Query to TestTable:\n"+err);
response.send(statusCodes.Error,err.message);
}
});
};
那么对于我的问题... AMS使用什么凭证来访问SQL数据库?如何更改权限以便上面的脚本正常工作(正如我见过的所有文档所暗示的那样!)。或者我不得不按照此question的建议传递连接字符串。
谢谢!
答案 0 :(得分:3)
创建移动服务时,它会生成SQL数据库后端,或连接到现有的SQL数据库。当它这样做时,创建一个具有随机名称的SQL登录用户。在您的情况下,用户是'zwxABOesblahblahHYzLogin'。当您删除并重新创建数据库时,您丢失了该用户可以访问数据库(我认为您已经知道)。
为了确定分配给创建用户的权限,我创建了一个新的Mobile Service,然后我使用SQL Management Studio编写整个数据库的脚本(我修改了脚本选项以确保权限将包含在脚本中)。然后我将其修剪为与用户和架构有关的内容。如果您已经重新创建了架构,则可以跳过该部分。
CREATE USER [zwxABOesblahblahHYzLogin] FOR LOGIN [zwxABOesblahblahHYzLogin] WITH DEFAULT_SCHEMA=[abc]
GO
GRANT CONNECT TO [zwxABOesblahblahHYzLogin] AS [dbo]
GRANT CREATE TABLE TO [zwxABOesblahblahHYzLogin] AS [dbo]
CREATE SCHEMA [abc]
GRANT CONTROL ON SCHEMA::[abc] TO [zwxABOesblahblahHYzLogin] AS [dbo]
从这看起来,AMS用户被授予数据库登录,连接权限,创建表权限,然后将模式控制权授予DBO。
我通过删除移动服务然后重新创建它来测试它,我认为这会使我们处于相同的场景中。