Microsoft Azure Mobile Service Javascript Custom API执行db存储过程权限问题

时间:2015-02-10 17:02:44

标签: 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);
        },
        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上运行它,它可以工作。 [我以管理员身份登录DB] 但是自定义API无法执行此SP,即使没有任何错误消息,结果变量也是一个空数组:" []"。

然后我将我的SP改为

Create PROCEDURE dbo.[spTest]
AS
BEGIN
        SELECT BrandName FROM dbo.tblBrands WHERE [_key]=105
END

它直接从表中选择而不是使用表变量,它可以工作。

由于自定义API将数据库与其自己的用户帐户连接,而不是管理员用户,我猜这个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);
    }        
})

};

声明表变量或临时表不会引发错误,但对它们的任何操作[select,insert,update]将获得异常,请求返回只是一个空数组[]。在日志中,只有"成功"记录。请帮忙

2 个答案:

答案 0 :(得分:2)

EDITTED:
啊,这与Temp表有关 - 你可以在sp的开头使用SET NOCOUNT ON - 这可以防止在临时表操作仍在发生时发送回done_in_proc消息。 https://msdn.microsoft.com/en-us/library/ms189837.aspx

您的新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'.

(fyi - 我用一些名称来混淆我的服务器/数据库/用户名)。

答案 1 :(得分:0)

我从网站的另一个帖子中找到了我的问题的解释:/azure-mobile-services-custom-api-update-ouput-followed-by-select-returns-empty/

简单来说,查询返回两个结果,一个来自表变量的插入操作,另一个来自表变量的select操作。好的自定义API只是从插入操作获得第一个空返回。有关解决方案,请参阅 carlosfigueira 的说明。