2010-05-26 73 views
0

這是情況。我正在編寫一個自動化測試,它遍歷proc的依賴列表並確定acct是否擁有所有依賴對象的權限。做功能在sql server中有不同的權限規則嗎?

我的代碼如下所示:

exec sp_depends 'the_proc_name' 

-- run this query on the results of sp_depends: 

select 
case       
when exists (         
select * 
from sys.database_permissions dp 
where grantee_principal_id=USER_ID('TheAccount')          
    and major_id=object_id('dbo.theDependentObject')          
    and minor_id=0 
    and state_desc = 'GRANT') 
then 'true' 
else 'false'         
end; 

這一切似乎是做工精細,但有當它遇到一個函數一個打嗝。我有一個案例,其中TheAccount沒有權限(上述查詢返回false)。但是,在TheAccount下運行時,調用該函數的proc運行正常。因此,我的測試代碼可能有問題,或者函數在SQL-Server中有特殊權限行爲,我不知道。

我應該將代碼更改爲僅搜索'DENY'而不是'GRANT'嗎?在proc中調用的函數是否會繼承調用過程的權限,除非執行權限被明確拒絕?我的代碼太爛了嗎?

回答

1

從存儲過程運行靜態SQL時,存儲過程以最後創建/修改存儲過程的id的權限運行;而不是運行存儲過程的人員的ID。

例如,這是一種相同的功能,允許您使用存儲過程運行Insert語句,而無需在基礎表上運行存儲過程插入權限。

請注意 - 當您使用動態SQL(使用exec語句)時,這不適用。在這種情況下,運行存儲過程的人員必須擁有該SQL語句的必要權限。

因此,我不確定您的單元測試是否會爲您提供所需的內容,因爲依賴對象的權利在某種程度上由SQL Server處理Stored Proc安全性的方式來處理。

+0

什麼?如果我創建一個proc並且不授予執行權限給你,你將不能執行它,除非你是dbo授予ProcNAme執行到UserName ...試試它創建一個proc然後嘗試作爲一個用戶執行只讀訪問。當然,您可以在proc中使用EXECUTE AS,但這是另一個故事 – SQLMenace 2010-05-26 15:30:05

+0

因此,如果DBA修改存儲的proc,那麼數據讀取器用戶運行proc,proc將以DBA的權限運行。這就是你說的,如果我正確地閱讀它。這聽起來很明顯是錯誤的。 – jcollum 2010-05-26 15:32:14

+0

是的,存儲過程將在DBA的權限下運行。但只有存儲過程中包含的靜態SQL。並且只有當您賦予存儲過程的EXEC權限時才行。 這允許你創建一個存儲過程,它不需要給每個人賦予插入權限;相反,你可以在存儲過程中發出Exec。以下是一個示例鏈接,http://www.sql-server-performance.com/articles/dba/security_sp_p1.aspx。此示例適用於SQL Server 2000,但它也適用於2005和2008。 – 2010-05-26 20:39:23