我有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]将获得异常,请求返回只是一个空数组[]。在日志中,只有"成功"记录。请帮忙
答案 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 的说明。