2013-10-20 45 views

回答

1

不,您必須明確授予該數據庫的權限。否則它將沒有專利。

您可能還需要檢查CREATE USER.

創建用戶授權訪問數據庫,但不會自動 授予在數據庫中的對象的任何訪問。創建用戶後, 常見操作是將用戶添加到具有訪問數據庫對象的 權限或將對象權限授予 用戶的數據庫角色。

另請檢查CREATE LOGIN

+0

就sql server而言,什麼是「只讀模式」,我可以問一下嗎?我的意思是,讀取權限*是*權限,對嗎? –

+0

@zespri: - 更新了我的答案。我的意思是讀取權限!對不起,誤導性的話:) –

+0

他們沒有閱讀權限。 –

2

不,它不給他們在該數據庫上的任何特權。

CREATE LOGIN [Foo] WITH PASSWORD=N'foo', 
        DEFAULT_DATABASE=[AdventureWorks2012], 
        DEFAULT_LANGUAGE=[British], 
        CHECK_EXPIRATION=OFF, 
        CHECK_POLICY=OFF 

然後使用這些憑據登錄提供錯誤消息

無法打開用戶默認數據庫。登錄失敗。用戶 'Foo'登錄失敗。

+0

+1,爲了更正我的知識! :) –

+0

用戶和登錄名之間可能有區別,值得指出。您的示例創建了一個登錄名,但它不創建數據庫用戶,這就是您看到錯誤消息的原因。 –

+1

@zespri - True,但您只能將默認數據庫分配給登錄名。 –

1

要開始在SQL Server中有用戶和登錄。粗略地說,登錄是服務器級別,用戶是數據庫級別。您需要將用戶映射到登錄名以允許用戶使用特定的登錄憑證連接到數據庫。

這是登錄分配默認數據庫,而不是用戶。

現在,當我們擺脫這種方式讓我們處理權限。數據庫中的每個用戶默認分配'public' database role。您不能刪除角色或從角色中刪除用戶。如果用戶沒有在數據庫中分配任何顯式權限,它將獲得公共角色的權限。這些權限是什麼,顯然在每種情況下都是不同的 - 它們是被授予的。要檢查他們,你可以運行this script

WITH [PublicRoleDBPermissions] 
AS 
(SELECT p.[state_desc] AS [PermissionType] 
     ,p.[permission_name] AS [PermissionName] 
     ,USER_NAME(p.[grantee_principal_id]) AS [DatabaseRole] 
     ,CASE p.[class] 
      WHEN 0 THEN 'Database::' + DB_NAME() 
      WHEN 1 THEN OBJECT_NAME(major_id) 
      WHEN 3 THEN 'Schema::' + SCHEMA_NAME(p.[major_id]) 
     END AS [ObjectName] 
FROM [sys].[database_permissions] p 
WHERE p.[class] IN (0, 1, 3) 
     AND p.[minor_id] = 0) 
SELECT [PermissionType] 
     ,[PermissionName] 
     ,[DatabaseRole] 
     ,SCHEMA_NAME(o.[schema_id]) AS [ObjectSchema] 
     ,[ObjectName] 
     ,o.[type_desc] AS [ObjectType] 
     ,[PermissionType] 
      + ' ' + [PermissionName] 
      + ' ON ' + QUOTENAME(SCHEMA_NAME(o.[schema_id])) 
      + '.' + QUOTENAME([ObjectName]) 
      + ' TO ' + QUOTENAME([DatabaseRole]) AS [GrantPermissionTSQL] 
     ,'REVOKE' 
      + ' ' + [PermissionName] 
      + ' ON ' + QUOTENAME(SCHEMA_NAME(o.[schema_id])) 
      + '.' + QUOTENAME([ObjectName]) 
      + ' TO ' + QUOTENAME([DatabaseRole]) AS [RevokePermissionTSQL] 
FROM [PublicRoleDBPermissions] p 
JOIN [sys].[objects] o 
    ON o.[name] = p.[ObjectName] 
AND OBJECTPROPERTY(o.object_id, 'IsMSShipped') = 0 
WHERE [DatabaseRole] = 'Public' 
ORDER BY [DatabaseRole], [ObjectName], [ObjectType] 

如果沒有被明確授予公共角色,就會有用戶沒有權限。例如,如果我運行這個(第一部分是借來from here):

CREATE LOGIN [Foo] WITH PASSWORD=N'foo', 
DEFAULT_DATABASE=[AdventureWorks2012], 
DEFAULT_LANGUAGE=[British], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF 
GO 

CREATE USER [Bar] FOR LOGIN [Foo] 
GO 

,然後嘗試從富登錄下的數據庫中進行選擇:

select * from person.address 

我會得到

對象'地址'上的SELECT權限被拒絕,數據庫 'AdventureWorks2012',模式'Person'。

這是因爲我的數據庫中的公共角色沒有任何額外的權限。

相關問題