MS SQL 批量给存储过程/函数授权
在工作当中遇到一个类似这样的问题:要对数据库账户的权限进行清理、设置,其中有一个用户Test,只能拥有数据库MyAssistant的DML(更新、插入、删除等)操作权限,另外拥有执行数据库存储过程、函数的权限,但是不能进行DDL操作(包括新建、修改表、存储过程等...),于是需要设置登录名Test的相关权限:
1:右键单击登录名Test的属性.
2: 在服务器角色里面选择"public"服务器角色。
3:在用户映射选项当中,选择"db_datareader"、"db_datawriter"、"public"三个数据库角色成员。
此时,已经实现了拥有DML操作权限,如果需要拥有存储过程和函数的执行权限,必须使用GRANT语句去授权,一个生产库的存储过程和函数加起来成千上百,如果手工执行的话,那将是一个辛苦的体力活,而我手头有十几个库,所以必须用脚本去实现授权过程。下面是我写的一个存储过程,亮点主要在于会判断存储过程、函数是否已经授予了EXE或SELECT权限给某个用户。这里主要用到了安全目录试图sys.database_permissions,例如,数据库里面有个存储过程dbo.sp_authorize_right,如果这个存储过程授权给Test用户了话,那么在目录试图sys.database_permissions里面会有一条记录,如下所示:
如果我将该存储过程授予EXEC权限给TEST1,那么
GRANT EXEC ON dbo.sp_diskcapacity_cal TO Test;
GRANT EXEC ON dbo.sp_diskcapacity_cal TO Test1;
SELECT * FROM sys.sysusers WHERE name ='Test' OR name ='Test1'
其实grantee_principal_id代表向其授予权限的数据库主体 ID ,所以我就能通过上面两个视图来判断存储过程是否授予执行权限给用户Test与否,同理,对于函数也是如此,存储过程如下所示,其实这个存储过程还可以扩展,如果您有特殊的需要的话。
- USE MyAssistant;
- GO
- SET ANSI_NULLS ON;
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'sp_authorize_right')
- AND OBJECTPROPERTY(id, 'IsProcedure') =1)
- DROP PROCEDURE sp_authorize_right;
- GO
- --====================================================================================================
- -- ProcedureName : sp_authorize_right
- -- Author : Kerry
- -- CreateDate : 2013-05-10
- -- Blog : www.cnblogs.com/kerrycode/
- -- Description : 将数据库的所有自定义存储过程或自定义函数赋权给某个用户(可以继续扩展)
- /*****************************************************************************************************
- Parameter : 参数说明
- ******************************************************************************************************
- @type : 'P' 代表存储过程 , 'F' 代表存储过程,如果需要可以扩展其它对象
- @user : 某个用户账户
- ******************************************************************************************************
- Modified Date Modified User Version Modified Reason
- ******************************************************************************************************
- 2013-05-13 Kerry V01.00.01 排除系统存储过程和系统函数的授权处理
- 2013-05-14 Kerry V01.00.02 增加判断,如果某个存储过程已经赋予权限
- 则不做任何操作
- *****************************************************************************************************/
- --====================================================================================================
- CREATE PROCEDURE sp_authorize_right
- (
- @type AS CHAR(10) ,
- @user AS VARCHAR(20)
- )
- AS
- DECLARE @sqlTextVARCHAR(1000);
- DECLARE @UserId INT;
- SELECT @UserId = uid FROM sys.sysusers WHERE name=@user;
- IF @type = 'P'
- BEGIN
- CREATE TABLE #ProcedureName( SqlText VARCHAR(max));
- INSERT INTO #ProcedureName
- SELECT 'GRANT EXECUTE ON ' + p.name + ' TO ' + @user + ';'
- FROM sys.procedures p
- WHERE NOT EXISTS( SELECT 1
- FROM sys.database_permissions r
- WHERE r.major_id = p.object_id
- AND r.grantee_principal_id = @UserId
- AND r.permission_name IS NOT NULL )
- SELECT * FROM #ProcedureName;
- --SELECT 'GRANT EXECUTE ON ' + NAME + ' TO ' +@user +';'
- --FROM sys.procedures;
- --SELECT 'GRANT EXECUTE ON ' + [name] + ' TO ' +@user +';'
- -- FROM sys.all_objects
- --WHERE [type]='P' OR [type]='X' OR [type]='PC'
- DECLARE cr_procedure CURSOR FOR
- SELECT * FROM #ProcedureName;
- OPEN cr_procedure;
- FETCH NEXT FROM cr_procedure INTO @sqlText;
- WHILE @@FETCH_STATUS = 0
- BEGIN
- EXECUTE(@sqlText);
- FETCH NEXT FROM cr_procedure INTO @sqlText;
- END
- CLOSE cr_procedure;
- DEALLOCATE cr_procedure;
- END
- ELSE
- IF @type='F'
- BEGIN
- CREATE TABLE #FunctionSet( functionName VARCHAR(1000));
- INSERT INTO #FunctionSet
- SELECT 'GRANT EXEC ON ' + name + ' TO ' + @user + ';'
- FROM sys.all_objects s
- WHERE NOT EXISTS( SELECT 1
- FROM sys.database_permissions p
- WHERE p.major_id = s.object_id
- AND p.grantee_principal_id = @UserId)
- AND schema_id = SCHEMA_ID('dbo')
- AND( s.[type] = 'FN'
- OR s.[type] = 'AF'
- OR s.[type] = 'FS'
- OR s.[type] = 'FT'
- ) ;
- SELECT * FROM #FunctionSet;
- --SELECT 'GRANT EXEC ON ' + name + ' TO ' + @user +';' FROM sys.all_objects
- -- WHERE schema_id =schema_id('dbo')
- -- AND ([type]='FN' OR [type] ='AF' OR [type]='FS' OR [type]='FT' );
- INSERT INTO #FunctionSet
- SELECT 'GRANT SELECT ON ' + name + ' TO ' + @user + ';'
- FROM sys.all_objects s
- WHERE NOT EXISTS( SELECT 1
- FROM sys.database_permissions p
- WHERE p.major_id = s.object_id
- AND p.grantee_principal_id = @UserId)
- AND schema_id = SCHEMA_ID('dbo')
- AND( s.[type] = 'TF'
- OR s.[type] = 'IF'
- ) ;
- SELECT * FROM #FunctionSet;
- --SELECT 'GRANT SELECT ON ' + name + ' TO ' + @user +';' FROM sys.all_objects
- -- WHERE schema_id =schema_id('dbo')
- -- AND ([type]='TF' OR [type]='IF') ;
- DECLARE cr_Function CURSOR FOR
- SELECT functionName FROM #FunctionSet;
- OPEN cr_Function;
- FETCH NEXT FROM cr_Function INTO @sqlText;
- WHILE @@FETCH_STATUS = 0
- BEGIN
- PRINT(@sqlText);
- EXEC(@sqlText);
- FETCH NEXT FROM cr_Function INTO @sqlText;
- END
- CLOSE cr_Function;
- DEALLOCATE cr_Function;
- END
- GO
MS SQL 批量给存储过程/函数授权的更多相关文章
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- 查看SQL SERVER 加密存储过程,函数,触发器,视图
原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...
- MS SQL Server字符拆分函数
Insus.NET以前有用XQuery的nodes()方法写过一个函数,是MS SQL字符拆分的函数,http://www.cnblogs.com/insus/archive/2012/02/26/2 ...
- MS SQL Server的COALESCE函数
MS SQL Server的COALESCE函数是从一系列表达式中返回第一个NOT NULL的值. 检查[B],[Q],[S],[T],[U]的值: 检查顺序[B]->[Q]->[S]-& ...
- MS SQL Server时间常用函数
SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础 ...
- SQL 判断 ‘表,存储过程,函数 ...’ 已是否存在
下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...
- 获取MS SQL Server用户存储过程最近修改日期
最近开发一个网站,已经交给用户测试,不过用户反馈有些问题,需要修改.也许修改的存储过程较多.Insus.NET又懒得做些修改记录,在给用户作更新时,能快速找到最近修改过的存储过程,一一作更新即可. 我 ...
- MS SQL批量生成作业脚本方法介绍总结
在迁移或升级SQL Server数据库服务器时,很多场景下我们不能还原msdb,所以我们必须手工迁移SQL Server相关作业.如果手工生成每一个作业的脚本话,费时又费力,其实SQL Server中 ...
- 解决MS SQL Server 使用HashBytes函数乱码问题
HASHBYTES 语法(参考MSDN): HASHBYTES ( '<algorithm>', { @input | 'input' } ) <algorithm>::= M ...
随机推荐
- 深入理解ES6之—符号与符号属性
在js已有的基本类型(字符串,数值,布尔型,null和undefined)之外,es6引入了一种新的基本类型:==符号(Symbol)==.符号起初被设计用于创建对象私有成员. 符号没有字面量形式,你 ...
- windows虚拟内存管理
内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理.在应用程序中 ...
- centos perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql.so: undefined symbol: mysql_init
之前在安装天兔数据库监控工具lepus的时候,运行时一直报perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql. ...
- Vue + iView + vuex + vee-validate 完整项目总结
build/*.js config/*.js src/旧代码文件夹 部门最近的一个新项目启动,很幸运由我来主导整个前端部分的技术选型和整体架构,项目工作量很大,但是却没有足够的人手,只有三个连CSS都 ...
- Centos上安装jdk版本出错的问题
今天买了个阿里云的服务器,于是手动安装了一遍JavaWeb运行环境,首先安装jdk与配置jdk就遇到了问题. 我下载的是解压版的jdk-8u151-linux-i586.tar.gz.安装和配置到是蛮 ...
- spring使用之旅(二) ---- AOP的使用
什么是AOP? AOP基本概念 AOP使用--注解方式 AOP使用--XML方式 实例--日志 写在最前面的(源码地址): https://github.com/xc83415134/spring_a ...
- js和jquery通过this获取html标签中的属性值
<html> <head> <script type="text/javascript" src="jquery-1.10.2.min.js ...
- Ubuntu下配置ShadowS + Chrome
// 这是一篇导入进来的旧博客,可能有时效性问题. 题目和全文中的ShadowS指代以ShadowS开头名字的某工具,以预防文章被和谐.本机Ubuntu 14.04 LTS.在apt-get upda ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...