Microsoft Azure移动服务Javascript自定义API执行db存储过程权限问题
我有以下用于HTTP GET的自定义api函数,每个人都允许该权限:Microsoft Azure移动服务Javascript自定义API执行db存储过程权限问题,api,azure-mobile-services,Api,Azure Mobile Services,我有以下用于HTTP GET的自定义api函数,每个人都允许该权限: exports.get = function(request, response) { var mssql = request.service.mssql; mssql.query('exec dbo.spTest', { success: function (result){ request.respond(statusCodes.OK, result);
exports.get = function(request, response) {
var mssql = request.service.mssql;
mssql.query('exec dbo.spTest',
{
success: function (result){
request.respond(statusCodes.OK, result);
},
error: function(err) {
console.log("error is: " + err);
}
})
};
这是我的存储过程,非常简单:
Create PROCEDURE dbo.[spTest]
AS
BEGIN
DECLARE @tmpTest Table(BrandName VARCHAR(255))
INSERT INTO @tmpTest
SELECT BrandName FROM dbo.tblBrands WHERE [_key]=105
SELECT BrandName FROM @tmpTest
END
如果我在DB上运行它,它就会工作。[我以管理员身份登录数据库]
但自定义API无法执行此SP,即使没有任何错误消息,结果变量也是空数组“[]”
然后我将SP更改为
Create PROCEDURE dbo.[spTest]
AS
BEGIN
SELECT BrandName FROM dbo.tblBrands WHERE [_key]=105
END
它直接从表中选择,而不是使用表变量,它可以工作
因为自定义API使用自己的用户帐户(而不是管理员用户)连接DB,所以我猜这个API帐户没有足够的权限来声明表变量。我还尝试了临时表,它也不工作
有人知道授予自定义API用户权限的解决方案吗?多谢各位
更新:
忘记数据库端,即使以下脚本在API中也不起作用:
exports.get = function(request, response) {
var mssql = request.service.mssql;
mssql.query('declare @ttt Table(NAME VARCHAR(255)); insert into @ttt values (\'Jack\'); select * from @ttt;',
{
success: function (result){
console.log("success");
request.respond(statusCodes.OK, result);
},
error: function(err) {
console.log("error is: " + err);
}
})
})
声明一个表变量或临时表不会引发错误,但对它们的任何操作[选择、插入、更新]都会得到异常,请求返回只是一个空数组[]。在日志中,只记录了“成功”。请帮助编辑:啊,这与临时表有关-您只需在sp开始时使用
SET NOCOUNT ON
-这可以防止在临时表操作仍在进行时发送“已完成”进程中的消息
您的新SP看起来像:
Create PROCEDURE dbo.[spTest]
AS
BEGIN
-- Suppress RowCount done_in_proc messages emitted from insert
SET NOCOUNT ON
DECLARE @tmpTest Table(BrandName VARCHAR(255))
INSERT INTO @tmpTest
SELECT BrandName FROM dbo.tblBrands WHERE [_key]=105
-- Enable rowcount done_in_proc messages going forward and enabling rowcount meta
SET NOCOUNT OFF
SELECT BrandName FROM @tmpTest
END
原始答复:很难说没有访问数据库的权限,但这可能是一个模式权限问题吗?通常,会使用移动服务的名称创建一个新模式。AMS创建的服务帐户没有[dbo]架构的权限。您可以向架构授予权限(这不是一个好的安全做法,或者将sp置于AMS创建的架构下)。我可以重新编写类似您提出的问题:
EXECUTE AS user = 'ivZJMJrfRDLogin_MyAMSUser';
select * from dbo.TodoItem;
这返回:
The SELECT permission was denied on the object 'TodoItem', database 'MyAMS_db', schema 'dbo'.
(仅供参考-我用一些名称来模糊我的服务器/数据库/用户名)。我从网站的另一个线程中找到了对我的问题的解释:
简单地说,查询返回两个结果,一个是表变量的insert操作,另一个是表变量的select操作。定制API只是从insert操作中得到第一个空返回。请参阅Carlosfiguera的解释以了解解决方案。谢谢您的回答,我补充道d AMS用户作为“db_owner”的成员,我也将其授予dbo架构。它不起作用。实际上没有任何与权限相关的错误消息。我还做了一些其他快速测试,请查看我的更新问题。你是对的,我应该在SP中设置NOCOUNT。我不知道自定义API会沿着wi捕获那些已完成的\u进程消息第个结果集。谢谢你回答我的问题。你知道自定义API什么时候捕获那些在进程中完成的消息,如何读取结果中受影响的行数吗?谢谢你可以将set NOCOUNT OFF语句放在你真正想要返回结果的select语句之前。实际上,我会用这个建议编辑我的评论。