Security4:授予查看定义,执行SP和只读数据的权限

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

SQL Server数据库有完善的权限管理机制,对于存储过程,其权限分为查看定义,执行和修改,查看SP定义的权限是:VIEW DEFINITION ,执行存储过程的权限是:EXECUTE,修改SP的权限是:ALTER,但是该权限也能修改表结构,视图的定义等数据库对象。数据的读取权限是SELECT,这个查看定义是不同的权限。对于一个数据表,如果仅授予VIEW DEFINITION权限,而没有授予SELECT权限,那么用户只能查看数据表的结构(Schema),而无法查看表中存储的数据。

在管理权限时,可以给特定的用户授予“只能读取数据和执行SP,而不能修改数据”的权限,也就是,使特定的用户只能查看数据(只读,SELECT),只能查看定义(VIEW DEFINITION),和执行SP的权限(EXECUTE),这样的权限设置,既能使用户查看到业务数据,又能避免用户私自修改数据。

对于数据的读取权限,SQL Server内置固定数据库角色 db_datareader,把用户添加到该角色中,用户就被授予了对数据库中所有数据(表或视图)的读取权限,就是说,用户可以对数据表或视图执行select命令读取数据;也可以逆向思考,不允许用户修改数据,把用户添加到固定数据库角色 db_denydatawriter 中,这样,用户不能添加,更新和删除任何数据,就是说,不能对任何数据表执行insert,updae和delete命令。这两个数据库角色,相当于以下两个命令:

grant select to [domain\user];
deny update,delete,insert to [domain\user];

权限的分配分为:授予(grant)和拒绝(deny),对于已分配的权限,也可以通过回收(revoke)命令收回,权限管理是个技术活。

一,授予查看定义的权限

查看数据库对象的权限是VIEW DEFINITION,通常数据库对象是指:数据表,视图,存储过程,函数等,被授予VIEW DEFINITION权限之后,用户只能查看定义,而无法从数据表或视图中查看数据,无法执行SP和函数等。

1,授予SQL Server实例级别的查看定义的权限

以下代码用于授予权限VIEW ANY DEFINITION,代码必须在master数据库中执行,使指定的用户能够查看当前SQL Server实例中的所有数据库对象的定义:

use master
go
grant view any definition to [domain\user]

2,授予User,只能查看当前数据库对象的定义的权限

以下代码用于授予VIEW DEFINITION,使指定的用户能够查看指定数据库中的所有对象的定义:

use db_name
go
grant view definition to [domain\user]

3,授予User,只能查看当前数据库的指定数据库对象的定义的权限

以下代码用于授予VIEW DEFINITION,通过on子句,使指定的用户能够查看指定对象的定义:

use db_name
go
grant view definition 
on object::schema_name.object_name
to [domain\user]

二,授予执行存储过程的权限

以下代码授予用户执行存储过程的权限,通过on子句指定用户只能执行特定的SP:

use db_name
go
grant execute 
on object::schema_name.object_name
to [domain\user]

如果grant execute省略on子句,表示所有的SP,这样,用户可以执行数据库中的所有SP:

use db_name
go
grant execute 
to [domain\user]

三,授予用户修改存储过程的权限

修改存储过程的权限是ALTER,但是,ALTER同时也能修改表结构,视图定义等数据库对象,如下代码所示:

GRANT ALTER TO [domain\user]

如果仅授予用户修改SP的权限,那么必须逐个设置,或者把SP创建在独立的schema下,通过授予用户修改schema,达到控制用户只修改SP的目的:

GRANT ALTER 
ON SCHEMA::proc_schema
TO [domain\user]

四,授予用户查看SP的定义,执行和修改SP的权限

通过GRANT子句,可以一次性把查看SP的定义,执行和修改SP的权限都授予指定的用户:

GRANT ALTER, EXECUTE, VIEW DEFINITION 
ON SCHEMA::[proc_schema] 
TO [domain\user]

在GRANT子句中省略ON子句,表示授予用户的权限作用于所有的数据库对象,包括数据表,视图,存储过程,函数等。

五,授予Public用户查看定义的权限

当Login没有映射到相应的User时,该Login被映射到默认的Public,设置给用户查看定义的权限,这样,每个登陆到SQL Server实例的用户,都可以查看定义。

复制代码
use master 
go 
grant view any definition to public

use dbn_ame
go 
grant view definition to public
复制代码

六,授予用户查看定义,只读数据和执行SP的权限

存储过程 sp_msforeachdb @command 是微软未公开的存储过程,该存储过程遍历当前的SQL Server实例的所有数据库,在每个数据库中执行相同的命令:

use master
go

create login [domain\user]
from windows;
go

grant view any definition 
to [domain\user] ;
go

exec sp_msforeachdb 
'
use [?];
if not exists
(
    select *
    from sys.database_principals
    where name=''domain\user''
)
create user [domain\user]
for login [domain\user];
alter role  db_datareader
add member [domain\user];
grant execute to [domain\user];
'
go
View Code

遍历数据库的功能,也可以使用游标来实现,本文不再赘述。

 

参考文档:

Run same command on all SQL Server databases without cursors

Granting View Definition Permission to a User or Role in SQL Server

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: Security
标签: Security, 安全, 权限

本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5603243.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5月前
|
安全
/etc/security/cacerts 只读权限
/etc/security/cacerts 只读权限
128 0
|
8月前
|
存储 关系型数据库 MySQL
Mysql 用户管理(创建、删除、改密、授予权限、取消权限)
Mysql 用户管理(创建、删除、改密、授予权限、取消权限)
209 0
|
安全 容器
win10删除文件时权限不够(你需要来自Administrators 的权限才能对此文件进行更改,无法枚举容器的对象,访问被拒绝)
win10删除文件时权限不够(你需要来自Administrators 的权限才能对此文件进行更改,无法枚举容器的对象,访问被拒绝)
2926 0
win10删除文件时权限不够(你需要来自Administrators 的权限才能对此文件进行更改,无法枚举容器的对象,访问被拒绝)
|
Go
链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI11" 指示该对象没有列,或当前用户没有访问该对象的权限。
原文:链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI11" 指示该对象没有列,或当前用户没有访问该对象的权限。   SELECT * FROM OPENROWSET('SQLOLEDB', 'server=.
6110 0
|
10月前
|
SQL XML 缓存
修改若依的数据权限功能
修改若依的数据权限功能
956 0
|
Serverless
函数计算权限配置——主账号权限问题
函数计算权限配置——主账号权限问题自制脑图
59 0
函数计算权限配置——主账号权限问题
|
数据安全/隐私保护
如何检查某个用户是否具有某个权限对象上定义的某种权限
比如下图这个ABAP development studi里创建的角色是为了实现CDS view DEMO_CDS_AUTH_LIT_PFCG的权限控制,里面使用到了权限对象S_CARRID.
104 0
如何检查某个用户是否具有某个权限对象上定义的某种权限
|
分布式计算 DataWorks MaxCompute
MaxCompute中如何通过policy 禁止角色的删除权限
Policy授权则是一种基于主体的授权。通过Policy授权的权限数据(即访问策略)被看做是授权主体的一种子资源。只有当主体(用户或角色)存在时才能进行Policy授权操作。当主体被删除时,通过Policy授权的权限数据会被自动删除。 Policy授权使用MaxCompute自定义的一种访问策略语言来进行授权,允许或禁止主体对项目空间对象的访问权限。Policy授权机制,主要解决ACL授权机制无法解决的一些复杂授权场景。
1046 0
MaxCompute中如何通过policy 禁止角色的删除权限
|
关系型数据库
Case: 一个read-only 角色对某个schema下的新建的表,无需单独授权,直接拥有只读权
Case: 一个read-only 角色对某个schema下的新建的表,无需单独授权,直接拥有只读权限 首先,你要知道PostgreSQL默认schema下新建的表,对于一个普通用户不会有select的权限的,所以我需要修改PostgreSQl默认的权限,把select提前赋...
713 0