2011-08-10 45 views
3

我有一個驗證調用者是否被授權調用這個存儲過程給定PARAMS一個存儲過程。如果主叫方未被授權,我想RAISERROR與訪問被拒絕的錯誤號碼。現在,它不能是錯誤號10011(ACCESS在sys.messages拒絕),因爲錯誤號必須大於50000更大,我不想使用存儲過程sp_addmessage添加相同消息(英文和本地化的文本以及)剛重新創建相同的ACCESS DENIED錯誤。什麼是正確的方法來做到這一點?RAISERROR來表示拒絕訪問錯誤

編輯:,因爲所需的SQL代碼應該是與SQL Azure的兼容,最後我打電話RAISERROR沒有錯誤號和後面的代碼檢查默認的50000錯誤代碼(在SQL Azure中目前尚沒有支持sp_addmessagesys.messages)。

回答

1

你不能做到這一點,你要提出的是不是一個Access denied錯誤,而是一個Access denied with these parameters錯誤。 因此,您需要創建自定義錯誤並提出該錯誤。

如果你想在「真實」的訪問被拒絕的錯誤是在程序撤銷EXEC權利的問題。

2

創建一個表AccessDeniedTable當前DB用戶將不會獲得。當你打你的邏輯ACCESS DENIED條件問題上SELECT @x=COUNT(*) FROM AccessDeniedTable這應該拋出實際的錯誤你是後。

IF @Accesslevel<5 ---your condition here 
BEGIN 
    SELECT @x=COUNT(*) FROM AccessDeniedTable --throw standard ACCESS DENIED error 
    RAISERROR('FATAL ERROR',16,1) --just in case actual error is not thrown 
    RETURN 999999 --just in case 
END 
+1

這將產生以下迷惑紅鯡魚錯誤消息:「System.Data.SqlClient.SqlException:的SELECT權限被拒絕對象‘AccessDeniedTable’,數據庫‘富’,架構‘DBO’上。」根本不可取。 – kateroh

+0

@kateroh,使用這個想法,但將'select ...'改爲任何會導致您預期的系統消息。 –