2012-01-04 36 views
4

MSDN documentation for sys.database_permissions表示狀態列可以是'G','D','R'或'W'。 'R'值有'REVOKE'的描述,這使得它聽起來像一排,這個值將對應於撤銷的許可。但是,從the docs for REVOKE可以看出,撤銷權限完全可以將其刪除,所以我期望從sys.database_permissions中刪除該行。當我測試授權然後撤銷權限時發生了這種情況;在GRANT之後,在該視圖中顯示該權限,並在REVOKE後消失。sys.database_permissions何時包含state ='R'的行?

我的問題:在什麼情況下這個視圖會包含狀態設置爲'R'的行?我這樣問,因爲我不確定在代碼中檢查此視圖時是否需要處理'R'行。

我能想到的情況可能發生,但一些潛在的情景還沒有發現任何確認:

  • 如果授予一些毯子許可,然後撤銷一個更精細的權限「R」行可能會出現這是由一攬子許可所暗示的(細粒度許可將顯示爲'R')。到目前爲止,我還沒有找到任何這樣的權限。
  • 當SQL處理REVOKE命令並且整行消失時,'R'行可能會非常短暫地顯示。我沒有觀察到這一點,但大概只有一小段時間纔會出現。
+5

「[是 - 我相信它會發生無線列級權限的矛盾表或視圖燙髮(HTTP:/ /twitter.com/#!/jackrichins/status/154813692918235136)「 – 2012-01-05 06:42:52

+0

非常感謝@RemusRusanu - 看起來正確。你想發佈這個作爲答案,還是我? – Charlie 2012-01-08 16:03:44

回答

1

作爲回答Jack Richins on Twitter(感謝@Remus Rusanu用於轉發):

我相信這會發生相矛盾的表或視圖燙髮無線柱級權限。

我測試了這個,他是正確的。

0

是的,有可能sys.database_permissions表包含狀態爲R的行.R表示撤銷&它將在表的狀態列中存在。

我們也可以具有d(拒絕),G(批准),W(批准與格蘭特選項)R.

該狀態下列的數據類型沿着將是char(1)

見以下鏈接爲更好的理解。

http://msdn.microsoft.com/en-us/library/ms188367.aspx

+1

謝謝;我已經發現文檔(在原始問題中鏈接),我想知道的是爲什麼會出現這種情況。我將重新命名這個問題以使其更清楚。 – Charlie 2012-05-02 00:17:43

3

對於其可以具有柱的權限對象,如表或視圖, 的DENYGRANT對象權限的存在需要REVOKE列權限來保留。下面是一個工作示例,在SQL Server 2008上進行了測試,演示了何時中存在狀態爲R的記錄。如果GRANTREVOKE語句的順序相反,則狀態爲R的記錄不會保留。

https://gist.github.com/mches/d2282946fbe7f50a708b

CREATE USER RevokeTestUser WITHOUT LOGIN; 

REVOKE CONNECT TO RevokeTestUser AS dbo; 

CREATE TABLE dbo.RevokeTest (
    col int NOT NULL 
); 

GRANT SELECT ON dbo.RevokeTest TO RevokeTestUser AS dbo; 
REVOKE SELECT ON dbo.RevokeTest (col) TO RevokeTestUser AS dbo; 

SELECT * 
FROM sys.database_permissions 
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID(N'RevokeTestUser'); 

DROP USER RevokeTestUser; 

DROP TABLE dbo.RevokeTest; 

這些都是SELECT語句的結果:

class class_desc   major_id  minor_id grantee_principal_id grantor_principal_id type permission_name state state_desc 
1  OBJECT_OR_COLUMN 1081939822 0   31      1      SL  SELECT   G  GRANT 
1  OBJECT_OR_COLUMN 1081939822 1   31      1      SL  SELECT   R  REVOKE