数据库权限分配探讨

上周, 有位朋友给我提出了这样的需求:区分用户访问数据库的权限。顺便总结了下有如下要求:

 

某个用户查询所有数据库的权限

某个用户只有备份数据库的权限

给一个用户只能查看指定数据库的权限

给一个用户只有某个表的权限

 

要进行以上任务,首先我们先了解下数据库的权限相关的内容


主体

“主体” 是可以请求 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上面的信息。


权限管理非常复杂,以上只是做了简单的介绍。需要更加详细的内容,需要自己去研究。在technet上可以找到更加详细的信息。


原文地址:https://espider.github.io/CLR/inheritance-polymorphism/


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

内容转载自公众号

微软中国MSDN
微软中国MSDN
了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2015蓝桥杯省赛---java---B---6(加法变乘法)

题目 加法变乘法 思路分析 两个算式进行相减操作 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举public static void main(String[] args) {for (int i 1; i < 46; i) {for (int j i 2; j < 48; j) {if (i * (i 1) - (i i 1) j * (…

DI 之Spring更多DI的知识

转载自 【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3 3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化&#xff0c;指不提前初始化Bean&#xff0c;而是只有在真正使用时才创建及初始化Bean。 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值…

Microsoft发布新工具,简化JavaScript Web应用的创建

Microsoft发布了一系列工具用于快速生成基于JavaScript的Web应用&#xff0c;这些工具包含了dotnet new和对Node.js的巧妙运用。 dotnet new命令是.NET Core工具的一部分&#xff0c;它用简单的命令行语法创建&#xff08;spin up&#xff09;新项目。现在新工具已成为ASP.NET …

2015蓝桥杯省赛---java---B---7(牌型种数)

题目 牌型种数 思路分析 递归进行实现&#xff0c;弄好终止条件&#xff0c;牌的数目等于13 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举private static int ans;public static void main(String[] args) {f(0, 0);System.out.println(ans);}…

CLR运行时细节 - 继承多态的实现

关于多态不多解释了,在运行时决定和调用具体的实现,是面向对象的基础 设计模式的基础.准备把继承多态和接口多态分开,因为从CLR实现的角度继承多态相比于接口多态要简单得多,也更容易理解,本篇只讨论继承多态, .NET Framework 2.0 和 4.0 这两个版本在实现上稍微有点区别(这里先…

2015蓝桥杯省赛---java---B---8(饮料换购)

题目 饮料换购 饮料换购乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料&#xff0c;凭3个瓶盖可以再换一瓶C型饮料&#xff0c;并且可以一直循环下去&#xff0c;但不允许赊账。请你计算一下&#xff0c;如果小明不浪费瓶盖&#xff0c;尽量地参加活动&#xff0c;那么…

python123测验9程序题_python程序设计实验二

Python程序设计实验安徽工程大学班级&#xff1a;物流191 姓名&#xff1a;许岚岚 学号&#xff1a;3190505110日期&#xff1a;2020年3月21日指导教师&#xff1a;修 宇实验二 顺序结构程序设计(验证性实验)(二学时)【实验目的】(1)掌握数据的输入输出的方法&#…

Rider IDE恢复了对.NET Core调试的支持

近期发布的JetBrain的Rider IDE&#xff08;EAP17&#xff09;移除了对.NET Core调试支持。该功能与NuGet的一个软件包在许可上存在冲突&#xff0c;而EAP17使用NuGet提供的.NET Core项目调试功能&#xff0c;所以必须要移除该功能。为此&#xff0c;JetBrains迅速推出了Rider …

2016蓝桥杯省赛---java---B---1(煤球数目)

题目 煤球数目 思路分析 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main { // 简单枚举public static void main(String[] args) { // 171700int pre 1;int plus 2;long sum 1;for (int k 2; k < 100; k) {sum (pre plus); //…

vue 多页面多模块分模块打包 分插件安装_Vue渲染方式

Vue中的渲染方式总结可分四种:原有模板语法&#xff0c;挂载渲染使用render属性&#xff0c;createElement函数直接渲染使用render属性&#xff0c;配合组件的template属性&#xff0c;createElement函数渲染使用render属性&#xff0c;配合单文件组件&#xff0c;createElemen…

零配置 之 Spring注解实现Bean定义

转载自 零配置 之 12.3 注解实现Bean定义 ——跟我学spring3 12.3 注解实现Bean定义 12.3.1 概述 前边介绍的Bean定义全是基于XML方式定义配置元数据&#xff0c;且在【12.2注解实现Bean依赖注入】一节中介绍了通过注解来减少配置数量&#xff0c;但并没有完全消除在XML…

开源库 Natasha2016 ,让IL编程跑起来

背景&#xff1a; IL编程在普通的程序员的代码里几乎不会出现&#xff0c;但从Json.net、Dapper、Asp.net等等开源项目都体现出了IL编程的重要性。 在IL编程的时候&#xff0c;上百行甚至上千行的IL代码实在让人头大&#xff0c;调试不方便不说&#xff0c;IL编程的逻辑也是不同…

代码随想录27期|Python|Day24|回溯法|理论基础|77.组合

图片来自代码随想录 回溯法题目目录 理论基础 定义 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。回溯函数也就是递归函数&#xff0c;指的都是一个函数。 基本问题 组合问题&#xff08;无序&…

指纹识别软件安装包下载

微信关注公众号&#xff1a;1111的博客&#xff0c;回复“指纹识别”&#xff0c;即可获取指纹识别安装包的下载链接。本软件的版本为指纹识别2.0应用程序&#xff0c;在安装的过程中有以下几个注意点【一定要看】&#xff1a;安装完成之后直接运行&#xff1a;指纹识别.exe文件…

2016蓝桥杯省赛---java---B---2(生日蜡烛)

题目描述 生日蜡烛 思路分析 代码实现(方式一) package com.atguigu.TEST;class Main{public static void main(String[] args) {int sum236;int a0;//记录开始过生日的年龄for (int i 0; i < 100; i) {for (int j i; j < 100; j) {aaj;if(asum){System.out.printl…

ntp时间同步会导致mysql关闭吗?_ntp时间同步问题解决方法

http://www.pool.ntp.org/zone/asia0.asia.pool.ntp.org1.asia.pool.ntp.org2.asia.pool.ntp.org3.asia.pool.ntp.org2.1 注册表信息修改PDC配置外部时间源设置#config external NTP serverw32tm.exe /config /manualpeerlist:”0.asia.pool.ntp.org,1.asia.pool.ntp.org,2.asi…

javaSE视频教程正式启动

亲爱的小伙伴们&#xff1a;经过激烈的思想斗争之后&#xff0c;我决定了&#xff0c;决定什么呢&#xff1f;决定给大家送福利了&#xff01;对&#xff0c;是送福利了&#xff01;送什么福利呢&#xff1f;送教程&#xff0c;javaSE的教程免费送&#xff0c;主要还是由我来讲…

快速搭建本地 .NET Core 运行时调试环境

需要的软件环境&#xff1a; Oracle VM VirtualBoxCentOS 7llvm lldb 3.6.0 (3.5.0我试过 dumpobj时候一直报无效参数 Invalid parameter T_T) 先在VirtualBox创建新虚机&#xff1a;一路 Next &#xff0c;文件位置可以自定义下(默认是在Users/当前用户/.. 目录下)创建完选在设…

背包问题+图解

图解 代码实现 package com.atguigu.dynamic;/*** 创建人 wdl* 创建时间 2021/4/3* 描述*/ public class KnapsackProblem {public static void main(String[] args) {int[] w{1,4,3};//物品的重量int[] val{1500,3000,2000};//物品的价值 这里的val[i]就是前面的v[i]int m4;/…

java循环结构教程

循环的语法我发一下&#xff1a;while( 布尔表达式 ) {//循环内容}do {//代码语句}while(布尔表达式);for(初始化; 布尔表达式; 更新) {//代码语句}今天录制了一下java 的循环结构视频&#xff0c;包括while,do while以及for循环&#xff0c;时间有点长&#xff0c;所以大家看的…