2015-02-10 49 views
1

我爲HTTP GET下列自定義的API函數,該許可允許大家:微軟Azure移動服務的Javascript自定義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用戶權限的解決方案嗎?謝謝

UPDATE

忘掉DB身邊,就算下面的腳本不工作的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

EDITTED:
啊,這與臨時表做的事情 - 你可以用SET NOCOUNT ON在你的SP的開始 - 這可以防止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 - 我用一些名字來混淆我的服務器/數據庫/用戶名)。

+0

感謝您的回答,我將AMS用戶添加爲「db_owner」的成員,並且我還將其授予dbo模式。它不起作用。其實沒有任何與權限相關的錯誤信息。我也做了一些其他快速測試,請看看我更新的問題 – Yang 2015-02-10 20:04:28

+0

你是對的,我應該在SP中設置NOCOUNT ON。 我不知道自定義API會捕獲那些done_in_Proc消息以及結果集。謝謝你回答我的問題。 – Yang 2015-02-10 21:45:52

+0

你知道什麼時候自定義API捕獲那些done_in_Proc消息,如何讀取在結果中影響了多少行?謝謝 – Yang 2015-02-10 21:52:44

相關問題