Microsoft Azure移动服务Javascript自定义API执行db存储过程权限问题

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);

我有以下用于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);
        },
        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语句之前。实际上,我会用这个建议编辑我的评论。