授予权限的思路,可以用一句话来概括,那就是:授予 Principal 操作 Securable 的 Permission,在多数文档中,把 Principal 翻译为安全主体,Securable翻译为安全对象,Permission翻译为权限,授予权限的子句细分为三部分:Permission,Securable 和 Principal。最让人疑惑的是Principal和Securable,这两个概念有时候会相互转换。

Grants permissions on a securable to a principal

Principal是被授予权限的实体,包括login、user、role等,Securable是Principal操作的对象,可以是table、view、SP、函数等,也可以是login、user、role等对象;有时Principal会作为Securable,被Principal操纵,也就是说,Principal 是抽象意义上的安全主体,可以向安全主体授予权限,Principal分为Server level和Database level,最重要的两个Principal是Login和User,他们的区别是:

  • 登录名(Login)是Server级别的Principal,作用域是整个数据库引擎。若要连接 SQL Server 实例上的特定数据库,登录名必须映射到数据库用户。数据库内的权限是向数据库用户而不是登录名授予的。
  • 数据库用户(User)是数据库级别的Principal,作用域是数据库,登录名必须映射到数据库用户才能连接到数据库。一个登录名可以作为不同用户映射到不同的数据库,但在每个数据库中只能作为一个用户进行映射。

Login和User最基本的区别是Login用于控制用户是否有权限登陆SQL Server实例,User用于用户控制是否有权限访问数据库:

  • Login是登陆SQL Server的凭证,验证方式有两种,Windows 验证和SQL Server 验证。
  • User用于访问数据库,使用Login登陆到SQL Server实例之后,必须映射到User,才能访问数据库。
  • Login提供登录Server的帐号和密码,User用于访问数据库,Role是权限的集合,控制User访问的资源。User只有担当某一个角色或具有某些权限,才能访问数据库。
  • 创建Login之后,该Login能够登录到SQL Server实例,但是,仅仅被授予Public角色,在访问数据库时,必须基于Login创建相应的数据库用户(User),Login和User通过SID关联。

一,创建Login

根据验证类型,Login分为SQL Server登录和Windows域登录,在创建登录时,可以设置默认数据库(Default Database),指定Login登录的默认数据库,默认值是master数据库。

1,创建SQL Server 登录

CREATE LOGIN login_name
WITH PASSWORD = { 'password' }
,DEFAULT_DATABASE = database

2,创建Windows域登录

如果创建Windows域登录,映射到一个Windows域账户,登录名必须使用Windows域格式: [<domainName>\<login_name>].

CREATE LOGIN [<domain_Name>\<login_name>]
FROM WINDOWS
WITH DEFAULT_DATABASE = database

二,创建数据库用户(User)

在SQL Server中,通常情况下,User的创建都是基于master 数据库中的Login,该Login的来源有三种:基于Windows 域用户,Windows 域用户组,或SQL Server 验证。

1,创建User

CREATE USER user_name
FOR LOGIN login_name
WITH DEFAULT_SCHEMA = schema_name

参数解释:

  • user_name:是创建的数据库用户的名字,该名字在数据库中是唯一的,用于唯一标识一个用户;
  • login_name:是用户登录SQL Server实例的登录名,分为Windows域登录名和SQL Server登录名。Windows域登录名的格式是:[<domainName>\<loginName>] 通过SID将登录名(Login)和用户名(User)关联在一起。
  • WITH DEFAULT_SCHEMA = schema_name:指定用户默认的架构(Schema),默认的Schema是指用户在引用数据库对象时,如果省略框架名,那么SQL Server将首先从默认框架下进行查找数据库对象。

在创建新的用户时,没有指定用户默认的架构,有三种处理方式:

  • 如果该用户是某一个Windows 用户组的成员,该组有默认的架构,那么该用户默认的架构是组的默认架构;
  • 对于sysadmin角色(Fixed Server Role)的成员,其默认的架构始终是dbo,忽略Create User命令的设置;
  • 如果用户不属于组,也不是sysadmin角色的成员,SQL Server不能确定该用户的架构,设置默认的架构名dbo;

2,创建用户名,基于SQL Server登录

CREATE LOGIN WanidaBenshoof
WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks2012;
go
CREATE USER Wanida
FOR LOGIN WanidaBenshoof
WITH DEFAULT_SCHEMA = Marketing;

3,创建用户名,基于Windows 域登录 

CREATE USER [Domain1\WindowsUserBarry]
FOR LOGIN [Domain1\WindowsUserBarry];
use database_name
go
CREATE USER [Domain1\WindowsGroupManagers]
FOR LOGIN [Domain1\WindowsGroupManagers];

三,模拟权限

在SQL Server的安全模型中,模拟(IMPERSONATE )权限的安全对象是User或Login,被授予者(grantee )有权限模拟特定用户的安全上下文执行特定的操作。

例如,user1授予模拟user2的权限,当user2的安全上下文有足够的权限,而user1没有时,通过权限模拟,user1能够在user2的权限上下文中执行查询请求:

GRANT IMPERSONATE
ON USER:: user2
TO user1;

通过执行EXECUTE AS 命令模拟用户的权限,用户user1就运行在user2的安全上下文中,例如,user1在登陆数据库之后,模拟user2的权限:

EXECUTE AS USER = 'user2';

通过执行 REVERT 命令退出权限模拟,返回到用户原始的安全上下文中:

REVERT;

四,用户和组

SQL Server 可以创建一个Windows Group作为登陆和用户(User),所有属于该组的成员,都具有相同的权限。

1,列出组的所有成员

在当数据库中,查看某一个Security Group的所有成员:

exec master..xp_logininfo
@acctname = 'domain\group',
@option = 'members'

2,检查组的成员

当前数据库中,检查当前的用户是否属于特定的Security Group:

select is_member('domain\group')

函数is_member的返回值是:

  • 0:当前的用户(User)不是组的成员;
  • 1:当前的用户(User)是组的成员;
  • NULL:组名或角色名不存在于当前的数据库中;

注意,数据库是当前的数据库,如果用于资源管理(Resource Governor)中的分类函数(Classifier Function),那么,要注意分类函数所在的数据库,如果分类函数创建于master数据库,那么is_member函数的当前数据库就是master,检查的结果是当前用户是否属于当前数据库的组或角色。

五,特殊的用户

SQL Server在每个数据库中都内置两个特殊的用户:dboguest,在每个数据库中都有这两个用户(User):

  • dbodatabase owner的简称):是WINDOWS_USER,数据库的所有者(Owner),每个数据库都有一个dbo用户,SQL Server把固定服务器角色 sysadmin 的成员都映射到数据库用户 dbo上。
  • guest:顾客,是SQL_USER,SQL Server 允许任何没有映射到数据库用户的有效登陆(Login),使用guest账户登陆数据库。在登陆数据库之前,要求dbo分配权限给guest, 一般给guest查看(select)的权限。

1,dbo用户

sysadmin 服务器角色的成员自动映射为dbo用户,dbo不同于db_owner 数据库角色,db_owner角色的成员资格不授予dbo用户特权。

2,guest用户

当一个Login登陆到SQL Server之后,如果没有在数据库中映射相应的用户,那么该Login可以使用guest用户登陆数据库。guest用户默认存在每个数据库中,默认情况下,guest用户是禁用的,可以通过命令启用guest用户。

GRANT CONNECT TO GUEST

一旦启用guest用户,所有可以登陆到SQL Server的Login,都可以使用guest身份来访问数据库,并拥有guest用户的权限。可以通过命令禁用guest用户:

REVOKE CONNECT FROM GUEST;

注意:只能在 master 和 tempdb 以外的数据库中执行禁用GUEST帐号的操作,这是因为许多用户都需要以GUEST身份访问master 和 tempdb系统数据库,GUEST用户在master 和 tempdb数据库的权限被严格限制。

另外两个特殊的用户:INFORMATION_SCHEMA 和 sys,每个数据库都包含这两个用户,这两个用于是数据库引擎内部使用,不能被修改和删除。

参考文档:

Principals (Database Engine)

EXECUTE AS Clause (Transact-SQL)

SQL Server用户GUEST的简要介绍

Index的填充属性:FillFactor 和 PAD_INDEX的更多相关文章

  1. 数据库的索引和填充因子fillfactor

    索引分为聚簇索引和非聚簇索引 1.聚簇索引/聚集索引 聚簇索引的顺序就是数据的物理存储顺序,对于一个表来说,只有一个聚簇索引 create unique clustered index id_inde ...

  2. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  3. SQL Server 2008 R2【SET ANSI_PADDING填充属性】插入一条数据后,为何每一列都默认的在字符后多了几个空格

    当加入空格后查出 解决: 导致出现这样的现象的原因就是SET ANSI_PADDING选项. 这个选项只在数据表的字符串字段被更新或者新的数据行插入到表中的时候作用.它控制着SQL Server在遇到 ...

  4. padding填充属性

    内边距属性: 设置元素的内容与边框之间的距离. 分4个方向(上右下左): padding-top padding-right padding-bottom padding-left 说明:值不能为负值 ...

  5. Elasticsearch学习之图解Elasticsearch中的_source、_all、store和index属性

    转自 : https://blog.csdn.net/napoay/article/details/62233031 1. 概述 Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_s ...

  6. bean的创建(五)第五部分 属性填充

    AbstractAutowireCapableBeanFactory.populateBean protected void populateBean(String beanName, RootBea ...

  7. PyQt(Python+Qt)学习随笔:QToolBox工具箱currentItem对应的index、text、name、icon、ToolTip属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Designer中,toolBox主要有如下属性: 可以看到,toolBox的属性主要是与当前项相 ...

  8. 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...

  9. Spring 源码(16)Spring Bean的创建过程(7)属性填充

    知识回顾 上一篇介绍了Spring中三级缓存的singletonObjects.earlySingletonObjects.singletonFactories,Spring在处理循环依赖时在实例化后 ...

随机推荐

  1. solr4.3 java.lang.NumberFormatException

    solr java.lang.NumberFormatException 现象:定时每天全量,每隔5分钟增量DIH从mysql导入数据 solr4j返回加过Id列表,一天偶然出现 java.lang. ...

  2. 【原】iOS学习之应用之间的操作

    关于应用之间的相互操作,小编一直觉得非常高大上,在一次面试中被面试官一顿暴虐,今天小编就决定学习一下!经过一顿度娘,找到一些博客,不过都比较凌乱,我就打算自己整理一下! 首先要说的是每一个APP都可以 ...

  3. Linux系统学习优缺点

    Linux是一套操作系统,按照鸟哥的说法Linux提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构,这个架构是沿袭Unix良好的传统而来的,功能强大而且稳定性卓越.其实Torvalds ...

  4. iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸

    iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸 iPhone界面尺寸 设备 分辨 ...

  5. C#中的null与void

    一.null: 1.明义,null是什么意思? null是指一个变量没有指向具体对象的有效引用. 这句话什么意思呢?意思就是 1).能够使用null修饰的是变量: 2).主要指的是引用. 那么这就引出 ...

  6. 如何对tableview进行自定义多选

    前言: 很多入门不久的程序员或许都会遇到系统自带的tableview多选时cell选择时不能选择自己想要的点击时的颜色或者图片,这让初级开发者们很烦恼.今天,我试着花了几个小时的时间用了自己的想法,去 ...

  7. About_PHP读写文件

    1.PHP部分文件操作函数:fopen ,fread ,filesize,fwrite,fclose 2.unlink() rmdir() 删除函数 unlink() 删除文件函数:unlink(路径 ...

  8. C#判断数组是否为空

    string[] array=new[] { "1", "2", "3", "4", "5" }; ...

  9. Unity3d刚体Rigidbody与碰撞检测Collider

    做了一个碰撞的小Demo,用一个球去撞击一堵墙,结果在球和墙都设置了刚体和碰撞体的情况下,球穿过了墙.移动球的位置,球有时能穿过墙,有时会被墙阻挡. 对于球穿过了墙,这个问题,在网上找了一下答案,基本 ...

  10. svn 应该忽略的文件(visual studio)

    *.o *.lo .la ## .*.rej .rej .~ ~ .# .DS_Store thumbs.db Thumbs.db *.bak *.class *.exe *.dll *.mine * ...