Microsoft Azure Mobile Service Javascript Custom API execute db stored procedure 权限问题
Microsoft Azure Mobile Service Javascript Custom API executes db stored procedure permission issue
我有以下用于 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
它 select 直接来自 table 而不是使用 table 变量,它有效。
因为自定义API是用自己的用户账户连接数据库,而不是admin用户,我猜这个API账户没有足够的权限来声明table变量。我也试过temptable,也没用
有人知道授予自定义 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);
}
})
};
声明一个 table 变量或临时变量 table 不会引发错误,但对它们的任何操作 [select、插入、更新] 都会出现异常并请求 return 只是一个空数组[]。在日志中,只记录了"success"。请帮助
已编辑:
啊,这与 Temp table 有关 - 你可以在 sp 的开头使用 SET NOCOUNT ON
- 这可以防止 done_in_proc 消息在 temp table 行动仍在进行。 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'.
(仅供参考 - 我用一些名字来混淆我的 server/database/user 名字)。
我从站点中的另一个线程找到了对我的问题的解释:/azure-mobile-services-custom-api-update-ouput-followed-by-select-returns-empty/
简单来说,查询得到的结果有两种return,一种是对table变量的insert操作,另一种是对table变量的select操作.自定义 API 只是从插入操作中获取第一个空的 return。解决方法请参考carlosfigueira的解释。
我有以下用于 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
它 select 直接来自 table 而不是使用 table 变量,它有效。
因为自定义API是用自己的用户账户连接数据库,而不是admin用户,我猜这个API账户没有足够的权限来声明table变量。我也试过temptable,也没用
有人知道授予自定义 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);
}
})
};
声明一个 table 变量或临时变量 table 不会引发错误,但对它们的任何操作 [select、插入、更新] 都会出现异常并请求 return 只是一个空数组[]。在日志中,只记录了"success"。请帮助
已编辑:
啊,这与 Temp table 有关 - 你可以在 sp 的开头使用 SET NOCOUNT ON
- 这可以防止 done_in_proc 消息在 temp table 行动仍在进行。 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'.
(仅供参考 - 我用一些名字来混淆我的 server/database/user 名字)。
我从站点中的另一个线程找到了对我的问题的解释:/azure-mobile-services-custom-api-update-ouput-followed-by-select-returns-empty/
简单来说,查询得到的结果有两种return,一种是对table变量的insert操作,另一种是对table变量的select操作.自定义 API 只是从插入操作中获取第一个空的 return。解决方法请参考carlosfigueira的解释。