在SQL Server中创建用户、登录并授予权限

3

我创建了一个登录账户:bob

我授权他使用以下命令创建数据库:sp_addsrvrolemember 'dbcreator'

这将自动在登录账户bob下创建一个用户,并且用户名与登录名相同。

Login - bob
user- bob

用户是在主数据库中创建的吗?

我执行了这个查询:select * from sysusers,但在表格中找不到任何名为'bob'的用户。为什么会这样呢?

'bob'拥有创建数据库的权限。

现在我想授予他创建表的权限。那该怎么做呢?当我使用grant时,它说找不到用户'bob',为什么会这样呢?

grant create table to bob

接下来,我使用登录名为'bob'连接了SQL Server。然后,我创建了一个名为bobdb的数据库,并进入了bobdb。现在,如何在bobdb中给bob授予创建表的权限?

我需要添加一个新用户吗?

2个回答

5

登录是在服务器级别进行的 - 您在服务器上拥有一个登录。

用户在数据库级别 - 您可以为每个单独的数据库定义一个不同的用户,以便于单一登录。

当您运行“create user ....”语句时,用户是在当前活动的数据库中创建的...

所以,如果您在SSMS的master数据库中运行该查询 - 是的,那么该用户将在master数据库中创建,并且不存在于其他任何地方...


2
连接到任何数据库时使用您自己的身份...
CREATE LOGIN Bob WITH PASSWORD='<the password>';

这段话的意思是:创建一个仅具备作为Guest用户连接到任何数据库的权限的服务器级别的登录名。现在将该登录名添加到服务器级别的dbcreator角色中,并以Bob身份连接到服务器。发出CREATE DATABASE命令后,你仍然只拥有名为Bob的登录名。该登录名将拥有该数据库,可以通过运行以下命令进行验证...
SELECT  sp.name AS LoginName, dp.name AS UserName
FROM    bobdb.sys.database_principals AS dp
        INNER JOIN sys.server_principals AS sp ON dp.sid = sp.sid
WHERE   sp.name = 'Bob'
;

由于 Bob 登录拥有该数据库,因此他应该能够运行该数据库的大多数 DDL 命令。如果登录拥有数据库,则该登录可以在其中执行任何操作,包括创建表。
如果您将数据库所有者(ALTER AUTHORIZATION ON DATABASE::bobdb TO LoginNameOfNewOwner)更改为 Bob 以外的帐户,则明确授予用户 Bob 在 bobdb 中的权限是适当的。然后可以将 Bob 添加为名为 Bob 的用户,并仅授予该用户所需的最低特权。
有关更多信息,请参见链接到Books Online 中的 db_owner页面的部分。
此外,在 SQL 2000 之后,sysusers 已弃用。请参阅新系统目录视图
最后,K. Brian Kelly在SSC网站上发布了一个关于登录/用户映射的好总结。

我的问题仍有一半没有得到回答。 - sqlchild
1
你的授权命令是正确的,但它不起作用的原因是Bob login 是数据库中的dbo user。没有名为bob的database user,并且CREATE USER Bob FROM LOGIN Bob 将会得到一个错误消息(*Msg 15063, Level 16, State 1, Line 1 The login already has an account under a different user name.*)。现在在数据库中作为user* dbo 运行的Bob login 应该已经有创建表的权限。你只需要对除了Bob之外的数据库users*使用 CREATE USERGRANT CREATE TABLE TO - Phil Helmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接