在工作当中遇到一个类似这样的问题:要对数据库账户的权限进行清理、设置,其中有一个用户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与否,同理,对于函数也是如此,存储过程如下所示,其实这个存储过程还可以扩展,如果您有特殊的需要的话。

Code Snippet
  1. USE MyAssistant;
  2. GO
  3. SET ANSI_NULLS ON;
  4. GO
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7. IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'sp_authorize_right')
  8. AND OBJECTPROPERTY(id, 'IsProcedure') =1)
  9. DROP PROCEDURE sp_authorize_right;
  10. GO
  11. --====================================================================================================
  12. --        ProcedureName        :            sp_authorize_right
  13. --        Author               :            Kerry
  14. --        CreateDate           :            2013-05-10
  15. --        Blog                 :            www.cnblogs.com/kerrycode/
  16. --        Description          :            将数据库的所有自定义存储过程或自定义函数赋权给某个用户(可以继续扩展)
  17. /*****************************************************************************************************
  18. Parameter              :                         参数说明
  19. ******************************************************************************************************
  20. @type                  :  'P'  代表存储过程 , 'F' 代表存储过程,如果需要可以扩展其它对象
  21. @user                  :  某个用户账户
  22. ******************************************************************************************************
  23. Modified Date        Modified User        Version                    Modified Reason
  24. ******************************************************************************************************
  25. 2013-05-13           Kerry                 V01.00.01             排除系统存储过程和系统函数的授权处理
  26. 2013-05-14           Kerry                 V01.00.02             增加判断,如果某个存储过程已经赋予权限
  27. 则不做任何操作
  28. *****************************************************************************************************/
  29. --====================================================================================================
  30. CREATE PROCEDURE sp_authorize_right
  31. (
  32. @type        AS   CHAR(10)    ,
  33. @user        AS     VARCHAR(20)
  34. )
  35. AS
  36. DECLARE @sqlTextVARCHAR(1000);
  37. DECLARE @UserId    INT;
  38. SELECT @UserId = uid FROM sys.sysusers WHERE name=@user;
  39. IF @type = 'P'
  40. BEGIN
  41. CREATE TABLE #ProcedureName( SqlText  VARCHAR(max));
  42. INSERT  INTO #ProcedureName
  43. SELECT  'GRANT EXECUTE ON ' + p.name + ' TO ' + @user + ';'
  44. FROM    sys.procedures p
  45. WHERE   NOT EXISTS( SELECT 1
  46. FROM   sys.database_permissions r
  47. WHERE  r.major_id = p.object_id
  48. AND r.grantee_principal_id = @UserId
  49. AND r.permission_name IS NOT  NULL )
  50. SELECT * FROM #ProcedureName;
  51. --SELECT  'GRANT EXECUTE ON ' + NAME + ' TO ' +@user +';'
  52. --FROM    sys.procedures;
  53. --SELECT 'GRANT EXECUTE ON ' + [name] + ' TO ' +@user +';'
  54. -- FROM sys.all_objects
  55. --WHERE [type]='P' OR [type]='X' OR [type]='PC'
  56. DECLARE cr_procedure CURSOR FOR
  57. SELECT * FROM #ProcedureName;
  58. OPEN cr_procedure;
  59. FETCH NEXT FROM cr_procedure  INTO @sqlText;
  60. WHILE @@FETCH_STATUS = 0
  61. BEGIN
  62. EXECUTE(@sqlText);
  63. FETCH NEXT FROM cr_procedure INTO @sqlText;
  64. END
  65. CLOSE cr_procedure;
  66. DEALLOCATE cr_procedure;
  67. END
  68. ELSE
  69. IF @type='F'
  70. BEGIN
  71. CREATE TABLE #FunctionSet( functionName VARCHAR(1000));
  72. INSERT  INTO #FunctionSet
  73. SELECT  'GRANT EXEC ON ' + name + ' TO ' + @user + ';'
  74. FROM    sys.all_objects s
  75. WHERE   NOT EXISTS( SELECT 1
  76. FROM   sys.database_permissions p
  77. WHERE  p.major_id = s.object_id
  78. AND  p.grantee_principal_id = @UserId)
  79. AND schema_id = SCHEMA_ID('dbo')
  80. AND( s.[type] = 'FN'
  81. OR s.[type] = 'AF'
  82. OR s.[type] = 'FS'
  83. OR s.[type] = 'FT'
  84. ) ;
  85. SELECT * FROM #FunctionSet;
  86. --SELECT 'GRANT EXEC ON ' + name + ' TO ' + @user +';' FROM sys.all_objects
  87. -- WHERE schema_id =schema_id('dbo')
  88. --     AND ([type]='FN' OR [type] ='AF' OR [type]='FS' OR [type]='FT' );
  89. INSERT  INTO #FunctionSet
  90. SELECT  'GRANT SELECT ON ' + name + ' TO ' + @user + ';'
  91. FROM    sys.all_objects s
  92. WHERE   NOT EXISTS( SELECT 1
  93. FROM   sys.database_permissions p
  94. WHERE  p.major_id = s.object_id
  95. AND  p.grantee_principal_id = @UserId)
  96. AND schema_id = SCHEMA_ID('dbo')
  97. AND( s.[type] = 'TF'
  98. OR s.[type] = 'IF'
  99. ) ;
  100. SELECT * FROM #FunctionSet;
  101. --SELECT 'GRANT SELECT ON ' + name + ' TO ' + @user +';' FROM sys.all_objects
  102. -- WHERE schema_id =schema_id('dbo')
  103. --     AND ([type]='TF' OR  [type]='IF') ;
  104. DECLARE cr_Function CURSOR FOR
  105. SELECT functionName FROM #FunctionSet;
  106. OPEN cr_Function;
  107. FETCH NEXT FROM cr_Function INTO @sqlText;
  108. WHILE @@FETCH_STATUS = 0
  109. BEGIN
  110. PRINT(@sqlText);
  111. EXEC(@sqlText);
  112. FETCH NEXT FROM cr_Function INTO @sqlText;
  113. END
  114. CLOSE cr_Function;
  115. DEALLOCATE cr_Function;
  116. END
  117. GO

MS SQL 批量给存储过程/函数授权的更多相关文章

  1. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  2. 查看SQL SERVER 加密存储过程,函数,触发器,视图

    原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...

  3. MS SQL Server字符拆分函数

    Insus.NET以前有用XQuery的nodes()方法写过一个函数,是MS SQL字符拆分的函数,http://www.cnblogs.com/insus/archive/2012/02/26/2 ...

  4. MS SQL Server的COALESCE函数

    MS SQL Server的COALESCE函数是从一系列表达式中返回第一个NOT NULL的值. 检查[B],[Q],[S],[T],[U]的值: 检查顺序[B]->[Q]->[S]-& ...

  5. MS SQL Server时间常用函数

    SQLServer时间日期函数详解,SQLServer,时间日期, 1.      当前系统日期.时间 select getdate() 2. dateadd      在向指定日期加上一段时间的基础 ...

  6. SQL 判断 ‘表,存储过程,函数 ...’ 已是否存在

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

  7. 获取MS SQL Server用户存储过程最近修改日期

    最近开发一个网站,已经交给用户测试,不过用户反馈有些问题,需要修改.也许修改的存储过程较多.Insus.NET又懒得做些修改记录,在给用户作更新时,能快速找到最近修改过的存储过程,一一作更新即可. 我 ...

  8. MS SQL批量生成作业脚本方法介绍总结

    在迁移或升级SQL Server数据库服务器时,很多场景下我们不能还原msdb,所以我们必须手工迁移SQL Server相关作业.如果手工生成每一个作业的脚本话,费时又费力,其实SQL Server中 ...

  9. 解决MS SQL Server 使用HashBytes函数乱码问题

    HASHBYTES 语法(参考MSDN): HASHBYTES ( '<algorithm>', { @input | 'input' } ) <algorithm>::= M ...

随机推荐

  1. 利用.Net自带的票据完成BaseController的未登陆自动跳转到登陆页功能

    一:定义票据中要记录的字段类 /// <summary> /// 用户存在于浏览器端的身份票据(非持久) /// 非持久 FormsAuthenticationTicket 的isPers ...

  2. MYSQL的REPLACE和ON DUPLICATE KEY UPDATE使用

    REPLACE 我们在使用数据库时可能会经常遇到这种情况.如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误.当然,我们可能想用新记录 ...

  3. java_web学习(八) jdbc连接mysql

    首先我们来看一下主机与数据库的关系图 实际上是两台服务器 一:下载数据库驱动jar包存放WebContent—WEB-INF—lib目录下 1.2步骤 1. 2. 3 4. 1.3 将jar包导入到W ...

  4. DOM拓展表格小练习

    涉及的知识点 DOM操作HTML页面.DOM操控表格.一些基本的事件.遍历知识.数组字符串知识.函数的作用域知识 效果图 html代码 <body><div id="con ...

  5. bzoj:3392: [Usaco2005 Feb]Part Acquisition 交易

    Description     奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤50000)颗行星,在行星上进行交易.为了方便,奶牛们已经给可能出现的K(1≤K≤1000)种货物 ...

  6. 类A是公共的,应在名为A.java的文件中声明错误

    第一种!!! “类A是公共的,应在名为A.java的文件中声明”这句话需要分两步来理解: 1.如果类A被声明为公共的(public),那么必须将类A保存在名为A.java的文件中: 2.反之,在一个文 ...

  7. Vijos P1497 立体图【模拟】

    立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子, ...

  8. bzoj usaco 金组水题题解(2)

    续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...

  9. flume1.8 开发指南学习感悟

    概述: Apache Flume是一个分布式.可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据. 架构及数据流动模型: flume实际上就是一个Agent.Age ...

  10. Java XML 序列化和反序列化

    Utils 类: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWr ...