在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚了解,已经被人问了几次了,所以还是在这里介绍一下,很多人都会问,我能否单独对表的某列授权给某个用户? 答案是可以,我们可以对表中的列授予SELECT、UPDATE权限,我们结合下面的简单案例来阐述一下可能效果更好。

案例1: 在AdventureWorks2014中,登录名UserA 只能有权限查询[Person].[Person]里面的BusinessEntityID, NationalIDNumber, LoginID三个字段权限,不能查询其它字段

USE [master]

GO

CREATE LOGIN [UserA] WITH PASSWORD=N'UserA', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [AdventureWorks2014]

GO

CREATE USER [UserA] FOR LOGIN [UserA]

GO

给用户授予相关列的查询权限(SELECT)

GRANT SELECT(BusinessEntityID, NationalIDNumber, LoginID) ON  [HumanResources].[Employee] TO [UserA]

此时你可以用下面SQL查看授予UserA的权限:

SELECT  dp.grantee_principal_id ,

        P.name AS UName ,

        dp.permission_name ,

        C.name ,

        OBJECT_NAME(O.object_id) AS TabName

FROM    sys.database_permissions dp

        INNER JOIN sys.objects O ON dp.major_id = O.object_id

        INNER JOIN sys.columns C ON C.object_id = O.object_id

                                    AND C.column_id = dp.minor_id

        INNER JOIN sys.database_principals P ON P.principal_id = dp.grantee_principal_id;

以用户UserA登录,如下所示,如果查询语句使用BusinessEntityID, NationalIDNumber, LoginID字段之外的其它字段,就会出现类似下面错误,当然也不能使用SELECT *之类的查询语句。

Msg 230, Level 14, State 1, Line 8

The SELECT permission was denied on the column 'JobTitle' of the object 'Employee', database 'AdventureWorks2014', schema 'HumanResources'.

另外,也可以只授权用户更新某个列,例如对于登录名UserB,只允许其修改Person.Address的AddressLine1,AddressLine2两个字段,其它字段不许修改。

GRANT UPDATE(AddressLine1,AddressLine2) ON [Person].[Address] TO UserB;

 

SELECT  dp.grantee_principal_id ,

        P.name AS UName ,

        dp.permission_name ,

        C.name ,

        OBJECT_NAME(O.object_id) AS TabName

FROM    sys.database_permissions dp

        INNER JOIN sys.objects O ON dp.major_id = O.object_id

        INNER JOIN sys.columns C ON C.object_id = O.object_id

                                    AND C.column_id = dp.minor_id

        INNER JOIN sys.database_principals P ON P.principal_id = dp.grantee_principal_id

WHERE P.name='UserB'

另外,关于DELETE、INSERT权限,这个是没有所谓的列权限(Column Permissions)的,其实从逻辑上想想,你也能明白,这这两者对应的最小单位为一条记录,所以根本不能再细化到列级别了。

Msg 1020, Level 15, State 1, Line 36

Sub-entity lists (such as column or security expressions) cannot be specified for entity-level permissions.

SQL Server 关于列的权限控制的更多相关文章

  1. SQL Server 2016 行级别权限控制

    背景 假如我们有关键数据存储在一个表里面,比如人员表中包含员工.部门和薪水信息.只允许用户访问各自部门的信息,但是不能访问其他部门.一般我们都是在程序端实现这个功能,而在sqlserver2016以后 ...

  2. Sql Server数据库对象访问权限控制

    以下内容主要针对database层面的数据访问权限(比如select, insert, update, delete, execute…) 1.直接给user权限GRANT EXECUTE TO [u ...

  3. SQL Server 索引列的顺序——真的没关系吗

    原文:SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/2718/sql-server-index-column- ...

  4. [译]SQL Server分析服务的权限配置

    简介: 本文介绍如何配置SSAS数据库和cube相关维度的安全设置. 相对数据引擎来说,在Management Studio中配置分析服务的安全设置基本没什么区别.但是也会有一些限制,比如SSAS的权 ...

  5. 模拟实现SQL Server字段列显示的数据类型

    本文目录列表: 1.SQL Server表设计视图中的数据类型列展示效果 2.模拟实现类似的数据类型显示效果 3.测试效果 4.总结语 5.参考清单列表   1.SQL Server表设计视图中的数据 ...

  6. 使用sql语句创建修改SQL Server标识列(即自动增长列)

    一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...

  7. SQL Server 2012 列存储索引分析(翻译)

    一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...

  8. SQL Server 一列或多列重复数据的查询,删除

    业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关 ...

  9. SQL Server 一列或多列重复数据的查询,删除(转载)

    转载来源:https://www.cnblogs.com/sunxi/p/4572332.html 业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入 ...

随机推荐

  1. C++继承和多态

    继承 访问控制 基类的成员函数可以有public.protected.private三种访问属性. 类的继承方式有public.protected.private三种. 公有继承 当类的继承方式为pu ...

  2. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  3. js构建ui的统一异常处理方案(二)

    上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过 ...

  4. RDD、DataFrame和DataSet的区别

    原文链接:http://www.jianshu.com/p/c0181667daa0 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD ...

  5. jquery鼠标移动div内容上下左右滚动

    jquery鼠标移动div内容上下左右滚动 点击这里查看效果:http://keleyi.com/keleyi/phtml/jqtexiao/9.htm <!DOCTYPE html PUBLI ...

  6. c#自定义日志记录

    废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可. 默认保存在:项目/temp/log /// <summary> /// 日志类 /// & ...

  7. 增加删除字段修改字段名,修改表结构,非常用SQL语句技巧总结

    1.为数据表添加一个新字段 Alter TABLE [dbo].[CustomerBackupConfig] Add [Stamp] [timestamp] NULL GO 2.为数据表添加两个新字段 ...

  8. 使用SignalR实现即时通讯功能

    教程简介 SignalR的好处是可以让多个客户端之间进行互动,比如这篇教程就展示了当你在页面上拖动矩形方块的同时,其它打开这个页面的用户也将会看到你拖动的轨迹以及最终的结果,当然他们也可以通过拖动该方 ...

  9. [WCF编程]10.操作:请求/应答操作

    一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...

  10. Jsonp跨域访问

    很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...