在SQL Server中为用户分配默认数据库是否赋予他们对该数据库的权限?

时间:2013-10-20 19:10:07

标签: sql sql-server tsql

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

谢谢!

3 个答案:

答案 0 :(得分:2)

不,它没有给予他们对该数据库的任何特权。

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

然后使用这些凭据登录会显示错误消息

  

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

答案 1 :(得分:1)

不,您必须明确授予该数据库的权限。否则它没有任何优势。

您可能还想查看CREATE USER.

  

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

同时检查CREATE LOGIN

答案 2 :(得分:1)

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

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

现在,当我们解决这个问题时,让我们处理权限。默认情况下,数据库中的每个用户都被分配'public' database role。您无法从角色中删除角色或删除用户。如果未在数据库中为用户分配任何显式权限,则它将具有赋予public角色的权限。这些权限在每种情况下显然都是不同的 - 它们是已被授予的权限。要检查它们,您可以运行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

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

select * from person.address

我会得到

  

对象'Address',数据库上的SELECT权限被拒绝   'AdventureWorks2012',架构'人'。

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