就像标题所说,在SQL Server中为用户分配默认数据库是否赋予他们对该数据库的权限?它是否赋予用户读/写权限?完全管理?没有?
谢谢!
答案 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',架构'人'。
那是因为我的数据库中的公共角色没有任何额外的权限。