原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349

未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。

前一篇:http://blog.csdn.net/dba_huangzj/article/details/38944121

前言:

在SQL Server 2005之前,所有服务器和数据库元数据都是所有人可见的。当基于网银的系统把SQL Server实例共享给客户时,有可能可以看到其他用户的信息。从2005开始,可以通过控制权限来限制登录名或用户查看不必要的元数据。

实现:

如果你需要把数据库对所有登录名隐藏,可以移除public角色上的VIEW ANY DATABASE权限:

USE master;
GO
REVOKE VIEW ANY DATABASE TO public;

允许某些帐号查看所有数据库时,可以创建一个用户自定义服务器角色:

USE master;
CREATE SERVER ROLE [DatabaseViewer];
GO
GRANT VIEW ANY DATABASE TO [DatabaseViewer];
ALTER SERVER ROLE [DatabaseViewer] ADD MEMBER [Fred];

注意,master和tempdcb总是对所有登录可见。

你不能选择性地对某些数据库设置可见,一个登录要么能从【对象资源管理器】中看到所有数据库,要么所有库都不能被看到。如果一个登录名被授予VIEW ANY DATABASE服务器权限,那么可以在【对象资源管理器】中看到服务器所有数据库,或者从sys.databases 目录视图中查询所有的数据库。如果登录名没有这个权限但是映射到某个数据库的用户中,那么它依旧不能看到所有数据库,但是可以使用sys.databases返回数据库信息,并且使用USE 数据库命令来切换数据库。

允许选择性地可见数据库的唯一方式是让登录名作为数据库的owner:

ALTER AUTHORIZATION ON DATABASE::marketing TO [Fred];

数据库的owner有数据库内所有权限,但是一个数据库只有一个owner。不能让多个登录名同时对一个数据库进行owner设置。

在数据库内,可以定义特定数据库对象为某些用户可见,在SSMS中,右键数据库的【安全性】节点,选择【用户】→【属性】中的【安全对象】,然后在【查找】中添加特定对象,比如表、存储过程或者架构。然后勾选【查看定义】的【授予】列:

也可以用命令实现,这里注意上图中的【脚本】,当你不记得命令时,可以点一下这个按钮,会自动生成代码:

use [AdventureWorks2012]
GO
GRANT VIEW DEFINITION ON [dbo].[AWBuildVersion] TO [test]
GO

原理:

可以用下面语句查看可被授权的元数据权限:

SELECT  parent_class_desc AS parent ,
        class_desc AS class ,
        permission_name AS permission
FROM    sys.fn_builtin_permissions(NULL)
WHERE   permission_name LIKE 'VIEW%'
ORDER BY CASE parent_class_desc
           WHEN '' THEN 0
           WHEN 'SERVER' THEN 1
           WHEN 'DATABASE' THEN 2
           WHEN 'SCHEMA' THEN 3
         END ,
        class ,
        permission;

【查看定义】的权限是可以在非服务器范围内查看的权限。如果需要在所有范围内查看,需要使用【VIEW ANY DEFINITION】,授予这个权限可以允许登录查看实例中的所有定义,【查看所有数据库】适合那些仅需要访问数据库但是不需要访问服务器其他对象的登录名。

在数据库中,用户可以看到自己有权限的对象,默认情况下,一个用户仅是public数据库角色的成员,是没有权限的。使用db_datareader固定数据库角色可以允许这个用户看到所有表,授予VIEW DEFINITION给存储过程、函数或者触发器,允许你看到其底层代码。如果你不想让别人看到,可以在创建对象时使用WITH ENCRYPTION(在后续介绍。)

下一篇:http://blog.csdn.net/dba_huangzj/article/details/39473895

Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据的更多相关文章

  1. Chapter 2 User Authentication, Authorization, and Security(11):在已还原的数据库中修正登录映射错误

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/39496517,专题目录:http://blog.csdn.net/dba_huangzj ...

  2. Chapter 2 User Authentication, Authorization, and Security(10):创建包含数据库

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/39473895,专题目录:http://blog.csdn.net/dba_huangzj ...

  3. Chapter 2 User Authentication, Authorization, and Security(8):创建映射到登录名的数据库用户

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38944121,专题目录:http://blog.csdn.net/dba_huangzj ...

  4. Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐户管理权限

    原版的:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题文件夹:http://blog.csdn.net/dba_huangzj ...

  5. Chapter 2 User Authentication, Authorization, and Security(3):保server避免暴力袭击

    原版的:http://blog.csdn.net/dba_huangzj/article/details/38756693,专题文件夹:http://blog.csdn.net/dba_huangzj ...

  6. Chapter 2 User Authentication, Authorization, and Security(7):创建和使用用户自定义服务器角色

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38895357,专题目录:http://blog.csdn.net/dba_huangzj ...

  7. Chapter 2 User Authentication, Authorization, and Security(6):服务器权限授予粒度

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38867489,专题目录:http://blog.csdn.net/dba_huangzj ...

  8. Chapter 2 User Authentication, Authorization, and Security(5):使用固定服务器角色

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38844999,专题目录:http://blog.csdn.net/dba_huangzj ...

  9. Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐号的管理权限

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题目录:http://blog.csdn.net/dba_huangzj ...

随机推荐

  1. Python盗号原理-代码实现截屏键盘记录远程发送(不要做坏事)

    这年头盗号的从出不穷,不是脱裤就是社工钓鱼.今天呢我们就以前面的几篇技术文章做铺垫,来讲一下python盗号的原理(学习用途,请勿用于违法犯罪),知己知彼方能百战不殆嘛. 脱裤我们就不多提了,无非就是 ...

  2. 阻止Enter键回发到服务端Asp.net

    //阻止enter键回发到服务端$(function () {    $("input[type=text]").each(function () {        $(this) ...

  3. MAX(字段)加0与不加0的测试

    --max(字段名)中的"字段名"的数据类型是字符型的,"字段名"+ 0后,oracle会隐式的转换成数字型 --测试 )); insert into Test ...

  4. 建立自己的git服务器

    需求情景 就像金山快盘同步盘那样, 在开发环境windows 10和部署环境Ubuntu server 14.04之间建立同步关系.比如windows端多了一个a.txt文件,你推送后,Ubuntu端 ...

  5. Sublime text 添加lua

    tools ->build system->new build system... 输入: { "cmd": ["C:\\lua\\lua53.exe&quo ...

  6. 28 自定义View画坐标和柱状图

    自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...

  7. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  8. SpriteKit中为何不要在update方法中测试碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们若要在游戏中做碰撞检测有2种办法,一是利用物理引擎,二是自 ...

  9. PAM30 模拟登陆 投票

    Python真的是让人爱不释手啊,一直以来都不知道如何自动投票,然而今天有幸看到了PAM30,下面谈一谈我一个小案例吧. 准备 PAM30下载地址 编码前注意 由于一开始没有什么概念,还以为是个第三方 ...

  10. Dynamics CRM2016 业务流程之Task Flow(二)

    接上篇,Page页设置完后,按照业务流程管理也可以继续设置Insert page after branch 或者 Add branch,我这里选择后者,并设置了条件,如果Pipeline Phase ...