共计 3956 个字符,预计需要花费 10 分钟才能阅读完成。
本篇文章为大家展示了如何进行数据库权限分配的探讨,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
首先我们先了解下数据库的权限相关的内容
主体
“主体”是可以请求 SQL Server 资源的实体。与 SQLServer 授权模型的其他组件一样,主体也可以按层次结构排列。 主体的影响范围取决于主体定义的范围 (Windows、服务器或数据库) 以及主体是否不可分或是一个集合。 例如,Windows 登录名就是一个不可分主体,而 Windows 组则是一个集合主体。每个主体都具有一个安全标识符(SID)。
Windows 级别的主体
Windows 域登录名
Windows 本地登录名
SQL Server- 级的主体
SQL Server 登录名
服务器角色
数据库级的主体
数据库用户
数据库角色
应用程序角色
SQLServer sa 登录名
SQL Server sa 登录名是服务器级的主体。默认情况下,该登录名是在安装实例时创建的。
public 数据库角色
每个数据库用户都属于 public 数据库角色。 当尚未对某个用户授予或拒绝对安全对象的特定权限时,则该用户将继承授予该安全对象的 public 角色的权限。
INFORMATION_SCHEMA 和 sys
每个数据库都包含两个实体:
INFORMATION_SCHEMA 和 sys,它们都作为用户出现在目录视图中。这两个实体是 SQL Server 所必需的。 它们不是主体,不能修改或删除它们。
基于证书的 SQL Server 登录名
名称由双井号 (##)括起来的服务器主体仅供内部系统使用。下列主体是在安装 SQL Server 时从证书创建的,不应删除。
##MS_SQLResourceSigningCertificate##
##MS_SQLReplicationSigningCertificate##
##MS_SQLAuthenticatorCertificate##
##MS_AgentSigningCertificate##
##MS_PolicyEventProcessingLogin##
##MS_PolicySigningCertificate##
##MS_PolicyTsqlExecutionLogin##
guest 用户
每个数据库包括一个 guest。 授予 guest 用户的权限由对数据库具有访问权限,但在数据库中没有用户帐户的用户继承。不能删除 guest 用户,但可通过撤消该用户的 CONNECT 权限将其禁用。 可以通过在 master 或 tempdb 以外的任何数据库中执行 REVOKE CONNECTFROM GUEST 来撤消 CONNECT 权限。
客户端和数据库服务器
根据定义,客户端和数据库服务器是安全主体,可以得到保护。在建立安全的网络连接前,这些实体之间可以互相进行身份验证。SQLServer 支持 Kerberos 身份验证协议,该协议定义客户端与网络身份验证服务交互的方式。
创建数据库用户
SQL2016 中支持 11 种用户类型:
用户基于登录名在 master 这是最常见的用户类型。
基于登录名基于的 Windows Active Directory 帐户的用户
CREATE USER [Contoso\Fritz];
基于 Windows 组的登录名的用户。CREATE USER [Contoso\Sales];
基于使用 SQLServer 身份验证的登录名的用户。CREATE USER Mary;
在数据库进行身份验证的用户建议以帮助使你的数据库可移植性。
始终允许在 SQL Database。中包含的数据库中只允许存在 SQL Server。
基于无登录名的 Windows 用户的用户
CREATEUSER [Contoso\Fritz];
基于无登录名的 Windows 组的用户。CREATE USER [Contoso\Sales];
中的用户 SQLDatabase 或 SQL 数据仓库 基于 Azure Active Directory 的用户。CREATE USER [Contoso\Fritz] FROMEXTERNAL PROVIDER;
拥有密码的包含数据库用户。(在中不可用 SQL 数据仓库。)CREATE USER Mary WITHPASSWORD = ********
基于 Windows 主体通过 Windows 组登录名进行连接的用户
基于无登录名但可通过 Windows 组中的成员身份连接到数据库引擎的 Windows 用户的用户
CREATE USER [Contoso\Fritz];
基于无登录名但可通过其他 Windows 组中的成员身份连接到数据库引擎的 Windows 组的用户。CREATE USER [Contoso\Fritz];
无法进行身份验证的用户 这些用户无法登录到 SQL Server 或 SQL Database。
没有登录名的用户。不能登录,但可以被授予权限
CREATE USER CustomAppWITHOUT LOGIN;
基于证书的用户。不能登录,但可以被授予权限,也可以对模块进行签名。CREATE USERTestProcess FOR CERTIFICATE CarnationProduction50;
基于非对称密钥的用户。不能登录,但可以被授予权限,也可以对模块进行签名。CREATE User TestProcessFROM ASYMMETRIC KEY PacificSales09;
下面的图片显示了创建数据库用户需要的选项的含义:
创建用户可以使用界面完成:
也可以使用 T -SQL 来进行创建
— 创建登录名:Test 密码是:123456 .
CREATELOGIN Test
WITH PASSWORD = 123456
GO
上面说完了用户,下面说下数据库的角色和权限
服务器级别的权限
SQL Server 提供服务器级角色以帮助你管理服务器上的权限。这些角色是可组合其他主体的安全主体。服务器级角色的权限作用域为服务器范围。 (“角色”类似于 Windows 操作系统中的“组”。)
SQL Server 提供了九种固定服务器角色。无法更改授予固定服务器角色的权限。从 SQL Server 2012 开始,您可以创建用户定义的服务器角色,并将服务器级权限添加到用户定义的服务器角色。
你可以将服务器级主体 (SQL Server 登录名、Windows 帐户和 Windows 组) 添加到服务器级角色。 固定服务器角色的每个成员都可以将其他登录名添加到该同一角色。用户定义的服务器角色的成员则无法将其他服务器主体添加到角色。
下表显示了服务器级的固定角色及其权限
下表显示了固定数据库角色及其能够执行的操作。所有数据库中都有这些角色。无法更改分配给固定数据库角色的权限
无法更改分配给固定数据库角色的权限。下图显示了分配给固定数据库角色的权限:
SQL 2016 有一些数据库的特殊权限
msdb 角色
msdb 数据库中包含下表显示的特殊用途的角色。
使用 R Services
SQL Server(从 SQL Server vNext 开始)
安装 R Services 时,其他数据库角色可用于管理包
下面讲如何实现文章前面说的需求:
给某个用户查询所有数据库的权限
给某个用户只有备份数据库的权限
给一个用户只有指定数据库的权限
给一个用户只有某个表的权限
给某个用户查询所有数据库的权限
创建一个用户
USE [master] GO CREATE LOGIN [Test1]WITH PASSWORD=N password@123
使用 Test1 连接数据库实例
可以看到数据库列表,但是无法访问数据库,
赋予 test1 对 FinaceDemo 的读取权限
USE [FinaceDemo] GO CREATE USER [Test1] FOR LOGIN [Test1] ALTER ROLE [db_datareader] ADD MEMBER [Test1] GO
这样就可以给 test1 用户对 finacedemo 的读取权限
但是 test1 没有写入权限
这样就可以单独对 test1 赋予数据库的读取权限进行查看操作。
给某个用户只有备份数据库的权限
Test1 对于 finacedemo 无备份权限
赋予备份权限
ALTER ROLE [db_backupoperator] ADD MEMBER [Test1]
给一个用户只有指定数据库的权限
我们需要 Test1 只能看到 FinanceDemo,其他所有数据库都不能看到
执行下面脚本
USE [master] Deny VIEW any DATABASE TO Test1; go
运行后的效果
Test1 连接后看不到任何数据库
执行:
ALTER AUTHORIZATIONON DATABASE::FinanceDemo TO test1
完成后结果:
Test1 能查看到赋予权限的数据库
给一个用户只有某个表的权限
创建测试用户 test3
USE [master] GO CREATE LOGIN [Test3] WITH PASSWORD=N password@123 —– 赋予 test2 可以登录 testDB USE [testdb] GO CREATE USER [Test3] FOR LOGIN [Test3] GO
赋予 test3 对于 t2 表的 update 和 select 权限 grant update on dbo.t2to test3 grant select on dbo.t2to test3 use testDB 查看 test3 用户获得的权限 exec sp_helprotect @username= test3
可以看到用户 test3 拥有了 t2 的 select 和 update 权限
执行 select * from t2
执行插入操作失败。
权限管理非常复杂,以上只是做了简单的介绍。需要更加详细的内容,需要自己去研究。在 technet 上可以找到更加详细的信息。
上述内容就是如何进行数据库权限分配的探讨,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。