就像标题所说的那样,在 SQL Server 中为用户分配默认数据库是否会授予他们对该数据库的权限?它是否赋予用户读/写权限?全管理员?没有任何?
谢谢!
不,它不会赋予他们对该数据库的任何特权。
CREATE LOGIN [Foo] WITH PASSWORD=N'foo',
DEFAULT_DATABASE=[AdventureWorks2012],
DEFAULT_LANGUAGE=[British],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
然后使用这些凭据登录会给出错误消息
无法打开用户默认数据库。登录失败。用户 'Foo' 登录失败。
首先,在 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 权限被拒绝。
那是因为我的数据库中的公共角色没有任何额外的权限。
不,您必须明确授予该数据库的权限。否则它将没有特权。
您可能还想检查CREATE USER。
创建用户会授予对数据库的访问权限,但不会自动授予对数据库中对象的任何访问权限。创建用户后,常见的操作是将用户添加到有权访问数据库对象的数据库角色,或授予用户对象权限。
还要检查CREATE LOGIN。