2009-11-06 74 views
0

我希望能夠擁有一個只能從特定頁面使用的存儲過程,而無需爲用戶創建權限/角色,而只需要以這種方式訪問​​單個存儲過程。如何控制對SQL Server中存儲過程的訪問?

例如我想要一個proc_GetCustomerItems存儲過程,它接受CustomerID的參數,然後返回客戶已購買的項目列表,但是我希望這僅適用於列出客戶項目的地方,例如。 ASP頁面顯示這個列表,但不能從其他任何地方工作,如查詢分析器等。
這是用另一個參數來提供額外的安全信息,基本問題是如何只允許某些方法和頁面訪問一個存儲過程,這可以通過角色或權限來完成嗎?

主要問題是如何正確設置存儲過程對代碼中特定方法的訪問權限,這將有助於強制使用所述存儲過程,因此必須明確允許GetCustomerItems方法(在ASP中爲例如)使用此存儲過程的權限。

我猜測角色和用戶訪問將成爲建議的替代方案,但我會感興趣的是,如果可以通過調用存儲過程來限制對存儲過程的訪問,我會感興趣。

回答

0

很難知道它是否適合您,通常我是親存儲過程,但我可以建議的唯一選擇是您不使用存儲過程。

取而代之的是,使用來自相關頁面的參數化sql。這樣,就沒有存儲過程存在從其他地方使用。

這意味着,如果不是這樣的話,那麼正在使用的用戶帳戶將需要對基礎表的直接權限。

3

不,這是不可能的。離我最近的我可以想象,只有訪問某個存儲過程的頁面才能使用來自其他頁面的不同憑據。如果您希望人們不使用查詢分析器訪問proc,則可以使用標準的SQL Server安全性功能。

+0

我有一種感覺,情況是這樣,但我想我會問,因爲這是我想知道作爲一種可能的選擇。無論如何,這可能很有用,因爲它顯示SQL安全功能可以基於連接提供此功能,該頁面可以像上述那樣使用該功能。 – RoguePlanetoid 2009-11-06 15:03:37

0

,你可以得到將代碼添加到您的存儲過程的開始處查詢APP_NAME()HOST_NAME()HOST_ID()值最接近,CURRENT_USER也許還有其他,如果有任何與您的應用程序的相關值不匹配,則只返回NULL或空行。這當然不會是頁面特定的,並且也不會有任何東西阻止某人使用查詢分析器來查看存儲過程本身的內容。

+0

感謝您的提問,問題的主要目的是在允許的情況下查看頁面是否可以使用存儲過程,而不是之前。當存儲過程的上下文必須僅爲Page時,這可能會有用。 – RoguePlanetoid 2009-11-06 15:14:17

+0

那麼,你也可以讓該頁面以不同的憑據運行sp到其他地方,或者只是將該頁面的連接字符串中的ApplicationName修改爲唯一的「block」其他所有內容。 – MartW 2009-11-06 15:25:03