SQL Server 关于列的权限控制
原文:SQL Server 关于列的权限控制

在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.

posted on 2018-08-03 09:02 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9411475.html

SQL Server 关于列的权限控制相关推荐

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

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

  2. SQL Server使用视图做权限控制

    问题引入 这天老鸟火急火燎的跑到菜鸟旁边,想必是遇到什么难题了:"现在有这么一个场景,假如有三种角色,并且存在层级关系,他们需要访问同一个数据源表,但是需要做权限控制,使得每种角色只能看到自 ...

  3. sql server新增列_SQL Server 2016安装中的新增功能?

    sql server新增列 SQL Server 2016 introduced officially on the 1st of June 2016. It comes with many new ...

  4. sql server伪列_伪简单SQL Server恢复模型

    sql server伪列 This article gives an overview of the Pseudo Simple SQL Server Recovery Model. It also ...

  5. SQL Server 2016 列存储技术做实时分析

    title: SQL Server 2016 列存储技术做实时分析 author: 风移 摘要 数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高.使用传统RDBMS数据分析 ...

  6. sql server新增列_SQL Server 2017中的新增功能

    sql server新增列 SQL Server 2017 is considered a major release in the history of the SQL Server life cy ...

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

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

  8. SQL Server研习录(29)——sql server 设置列自增长

    SQL Server研习录(29)--sql server 设置列自增长 版权声明 一.设置列自增长 1.创建表时 2.创建表后 版权声明 本文原创作者:清风不渡 博客地址:https://blog. ...

  9. sql server定义_在SQL Server中查看定义权限

    sql server定义 We have various database objects such as view, stored procedures, triggers, functions a ...

最新文章

  1. 单个神经元在深度网络中的作用
  2. 【玩转Ubuntu】01. Ubuntu上配置JDK
  3. c语言编程获取当前系统时间包含年,月,日,时,分,秒.,C语言获取系统时间的几种方式...
  4. STM32 基础系列教程 22 - CAN
  5. 使用HMTL5 API监控前端性能
  6. 鲁迅散文——狗的驳诘
  7. CentOS 7 yum 安装php5.6
  8. linux内核关闭网络巨帧xenomai,xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务...
  9. 手慢无!小米5G手机已抢光
  10. 什么是面向对象,为什么要面向对象
  11. ddddocr打包不成功解决办法
  12. 21天Jmeter打卡day9HTTP不同方法post提交表单和json
  13. 全国大学FTP列表!绝对经典!!!
  14. 5行代码识别各种验证码
  15. 分布式之CAP原则详解
  16. Linux系统安装迷你世界,迷你世界国际服下载安装
  17. Kalman滤波器参数分析
  18. js格式化日期和事件
  19. java 如何获取当前时间到夜晚12点的毫秒差值
  20. 这就是你日日夜夜想要的docker!!!---------docker+consul+ nginx集成分布式的服务发现与注册架构

热门文章

  1. 关于 Number() parsint() abs() 的区别
  2. centOS 阿里云yum地址配置
  3. python 列表 字典 读写文件:pickle模块的基本使用
  4. sublime text 3 前端开发常用插件
  5. Linux安装、卸载软件
  6. linux c++ 运行时报 段错误 的一个原因
  7. (Joomla)字符串截取
  8. CSS样式表的规划与组织
  9. cmd进入python环境_python2和python3同时存在,如何CMD中进入不同的环境
  10. 5. 多线程程序如何让 IO 和“计算”相互重叠,降低 latency?