首先需要建立一些登录名和用户名,后面操作会用到。
先来一张图,简单理解下登录名和用户名之间的联系。先大概有个印象。
打开SQL Server—>选择相应的数据库—>安全性—>用户—>右击新建用户
一般不会报错,如果出现此报错信息。
请仔细阅读报错信息,报错后一定要先阅读报错信息,不要把它当作炸弹赶紧关掉。
错误信息很明确,该登录已用另一个用户名开立账户,因为我已经用该登录名创建过一个用户。
再根据顶部图中,登录名和用户名之间的关系,一个登录名可以和多个不同库下的用户做映射,但是再同一个库下只能和一个用户名做映射。这样为什么报错,也就很明显了。
既然这样,先去创建一些登录名,再在某一个库下,建立对应的用户名。
建立登录名
安全性—>登录名—>右击新建
再回到某一库下,建立相应的用户名
图中的用户类型是 带登录名的SQL用户,当然也可以建立不带登录名的SQL用户,这样就不用关心登录名了。
就这样,建立七个
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]...
TO <用户>[,<用户>]...
[WITH GRANT OPTION]
将在某个对象上的某种权限授予某个用户。WITH GRANT OPTION用于指定该用户是否能传播该权限。
例:
把查询Student表的权限授予用户U1
GRANT SELECT
ON Student
TO U1
把对Student表和Course表的所有权限授予U2,U3
GRANT ALL PRIVILEGES
ON Student
TO U2,U3
GRANT ALL PRIVILEGES
ON Course
TO U2,U3
官方文档中查看。
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver15
把对表SC的查询权限授予所有用户
GRANT SELECT
ON SC
TO PUBLIC
把查询Student表和修改学生学号的权限授给用户U4
GRANT SELECT,UPDATE(Sno)
ON Student
TO U4
把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户。
GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION
GRANT INSERT
ON SC
TO U6
WITH GRANT OPTION
U6将权限传给U7
GRANT INSERT
ON SC
TO U7
语法:
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]...
FROM <用户>[,<用户>]...[CASCADE|RESTRICT]
把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON Student
FROM U4
登录U4
执行UPDATE
没错,没有相应的权限
以下省略截图
收回所有用户对表SC的查询权限
REVOKE SELECT
ON SC
FROM PUBLIC
把用户U5对SC表的INSERT权限收回
REVOKE INSERT
ON SC
FROM U5 CASCADE
角色是被命名的一组与数据库相关的权限,可以为一组具有相同权限的用户创建一个角色,简化授权过程。
(1)创建角色
CREATE ROLE <角色名>
(2)直接给角色授权
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>
TO <角色>[,<角色>]...
(3)角色给其他角色或用户授权
GRANT <角色1>[,<角色2>]...
TO <角色3>[,<用户1>]...
[WITH ADMIN OPTION]
(4)角色权限的收回
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>
FROM <角色>[,<角色>]...
通过角色实现将一组权限授予一个用户
--创建一个角色 R1
CREATE ROLE R1
--使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1
--将这个角色授予U1,U2,U3。使他们具有角色R1所包含的全部权限
ALTER ROLE R1 ADD MEMBER U1
ALTER ROLE R1 ADD MEMBER U2
ALTER ROLE R1 ADD MEMBER U3
一次性通过R1收回U1的这三个权限
ALTER ROLE R1 DROP MEMBER U1
角色权限的修改
GRANT DELETE
ON Student
TO R1
REVOKE SELECT
ON Student
FROM R1