1

就像标题所说的那样,在 SQL Server 中为用户分配默认数据库是否会授予他们对该数据库的权限?它是否赋予用户读/写权限?全管理员?没有任何?

谢谢!

4

3 回答 3

2

不,它不会赋予他们对该数据库的任何特权。

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

然后使用这些凭据登录会给出错误消息

无法打开用户默认数据库。登录失败。用户 'Foo' 登录失败。

于 2013-10-20T19:41:40.207 回答
1

首先,在 SQL Server 中有用户和登录。粗略地说,登录是服务器级别的,用户是数据库级别的。您需要将用户映射到登录名,以允许用户使用特定的登录凭据连接到数据库。

分配默认数据库的是登录名,而不是用户。

现在,当我们解决这个问题时,让我们处理权限。默认情况下,数据库中的每个用户都分配有“公共”数据库角色。您不能删除角色或从角色中删除用户。如果用户没有在数据库中分配任何显式权限,它将具有授予公共角色的权限。这些权限是什么,显然在每种情况下都是不同的——它们是被授予的。要检查它们,您可以运行此脚本

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]

如果没有明确授予公共角色任何权限,则用户将没有权限。例如,如果我运行这个(第一部分是从这里借来的):

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

然后尝试从Foo登录下的数据库中选择:

select * from person.address

我去拿

对象“地址”、数据库“AdventureWorks2012”、模式“人员”的 SELECT 权限被拒绝。

那是因为我的数据库中的公共角色没有任何额外的权限。

于 2013-10-20T20:32:21.723 回答
1

不,您必须明确授予该数据库的权限。否则它将没有特权。

您可能还想检查CREATE USER。

创建用户会授予对数据库的访问权限,但不会自动授予对数据库中对象的任何访问权限。创建用户后,常见的操作是将用户添加到有权访问数据库对象的数据库角色,或授予用户对象权限。

还要检查CREATE LOGIN

于 2013-10-20T19:12:32.247 回答