未经作者同意。不论什么人不得以“原创”形式公布,也不得已用于商业用途。本人不负责不论什么法律责任。
前一篇:http://blog.csdn.net/dba_huangzj/article/details/38944121
前言:
在SQL Server 2005之前,全部server和数据库元数据都是全部人可见的。当基于网银的系统把SQL Server实例共享给客户时,有可能能够看到其它用户的信息。
从2005開始,能够通过控制权限来限制登录名或用户查看不必要的元数据。
实现:
假设你须要把数据库对全部登录名隐藏,能够移除public角色上的VIEW ANY DATABASE权限:
USE master; GO REVOKE VIEW ANY DATABASE TO public;
同意某些帐号查看全部数据库时。能够创建一个用户自己定义server角色:
USE master; CREATE SERVER ROLE [DatabaseViewer]; GO GRANT VIEW ANY DATABASE TO [DatabaseViewer]; ALTER SERVER ROLE [DatabaseViewer] ADD MEMBER [Fred];
注意,master和tempdcb总是对全部登录可见。
你不能选择性地对某些数据库设置可见。一个登录要么能从【对象资源管理器】中看到全部数据库。要么全部库都不能被看到。
假设一个登录名被授予VIEW ANY DATABASEserver权限,那么能够在【对象资源管理器】中看到server全部数据库,或者从sys.databases 文件夹视图中查询全部的数据库。
假设登录名没有这个权限可是映射到某个数据库的用户中,那么它依然不能看到全部数据库。可是能够使用sys.databases返回数据库信息。而且使用USE 数据库命令来切换数据库。
同意选择性地可见数据库的唯一方式是让登录名作为数据库的owner:
ALTER AUTHORIZATION ON DATABASE::marketing TO [Fred];
数据库的owner有数据库内全部权限,可是一个数据库仅仅有一个owner。不能让多个登录名同一时候对一个数据库进行owner设置。
在数据库内,能够定义特定数据库对象为某些用户可见。在SSMS中。右键数据库的【安全性】节点,选择【用户】→【属性】中的【安全对象】,然后在【查找】中加入特定对象,比方表、存储过程或者架构。然后勾选【查看定义】的【授予】列:
也能够用命令实现,这里注意上图中的【脚本】,当你不记得命令时,能够点一下这个button,会自己主动生成代码:
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;
【查看定义】的权限是能够在非server范围内查看的权限。
假设须要在全部范围内查看。须要使用【VIEW ANY DEFINITION】。授予这个权限能够同意登录查看实例中的全部定义,【查看全部数据库】适合那些仅须要訪问数据库可是不须要訪问server其它对象的登录名。
在数据库中。用户能够看到自己有权限的对象。默认情况下。一个用户仅是public数据库角色的成员,是没有权限的。
使用db_datareader固定数据库角色能够同意这个用户看到全部表,授予VIEW DEFINITION给存储过程、函数或者触发器,同意你看到其底层代码。
假设你不想让别人看到,能够在创建对象时使用WITH ENCRYPTION(在兴许介绍。)
下一篇:http://blog.csdn.net/dba_huangzj/article/details/39473895