SQL Server中通用数据库角色权限的处理详解

SQL Server中通用数据库角色权限的处理详解

前言

安全性是所有数据库管理系统的一个重要特征。理解安全性问题是理解数据库管理系统安全性机制的前提。

最近和同事在做数据库权限清理的事情,主要是删除一些账号;取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_owner,授予最低要求的相关权限。但是这种工作完全是一个体力活,而且是吃力不讨好,而且推进很慢。另外,为了管理方便和细化,我们又在常用的数据库角色外,新增了6个通用的数据库角色。

如下截图所示。

 

另外,为了减少授权工作量和一些重复的体力活,我们创建了一个作业,每天定期执行一个存储过程db_common_role_grant_rigths,这个存储过程的逻辑如下:

    1:遍历所有用户数据库(排除了系统数据库以及一些特殊数据库),发现该数据库不存在这些通用数据库角色,那么就创建相关数据库角色。

    2:遍历所有用户数据库,为相关数据库角色授权,例如,如果发现某个新增的存储过程,没有授权给db_procedure_execute数据库角色。那么就执行授权操作。

当然目前还在测试、应用阶段,以后会根据具体相关需求,不断完善相关功能。

 

--==================================================================================================================
--  ScriptName   :   db_common_role_grant_rigths.sql
--  Author    :   
--  CreateDate   :   2018-09-13
--  Description   :   创建数据库角色db_procedure_execute等,并授予相关权限给角色。
--  Note     :  
/******************************************************************************************************************
  Parameters    :         参数说明
********************************************************************************************************************
    @RoleName   :   角色名
********************************************************************************************************************
 Modified Date Modified User  Version     Modified Reason
********************************************************************************************************************
 2018-09-12     V01.00.00  新建该脚本。
 2018-09-12     V01.00.01  注意@@ROWCOUNT的生效范围;解决循环逻辑问题。
 2018-09-26     V01.00.02  修正类型为FT(CLR_TABLE_VALUED_FUNCTION)的函数问题。程序集 (CLR) 表值函数
*******************************************************************************************************************/
--===================================================================================================================
USE YourSQLDba;
GO
  
  
IF EXISTS (SELECT 1 FROM sys.procedures WHERE type='P' AND name='db_common_role_grant_rigths')
BEGIN
 DROP PROCEDURE Maint.db_common_role_grant_rigths;
END
GO
  
CREATE PROCEDURE Maint.db_common_role_grant_rigths
AS
BEGIN
  
DECLARE @database_id INT;
DECLARE @database_name sysname;
DECLARE @cmdText  NVARCHAR(MAX);
DECLARE @prc_text  NVARCHAR(MAX);
DECLARE @RowIndex  INT;
  
IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
 DROP TABLE dbo.#databases;
  
CREATE TABLE #databases
(
 database_id  INT,
 database_name sysname
)
  
IF OBJECT_ID('TempDB.dbo.#sql_text') IS NOT NULL
 DROP TABLE dbo.#sql_text;
  
  
CREATE TABLE #sql_text
(
 sql_id  INT IDENTITY(1,1),
 sql_cmd  NVARCHAR(MAX)
)
  
INSERT INTO #databases
SELECT database_id ,
  name
FROM sys.databases
WHERE name NOT IN ( 'master', 'tempdb', 'model', 'msdb',
      'distribution', 'ReportServer',
      'ReportServerTempDB', 'YourSQLDba' )
  AND state = 0; --state_desc=ONLINE
  
  
--开始循环每一个用户数据库(排除了上面相关数据库)
WHILE 1= 1
BEGIN
  
  
 SELECT TOP 1 @database_name= database_name
 FROM #databases
 ORDER BY database_id;
  
  
 IF @@ROWCOUNT =0
  BREAK;
  
 --PRINT(@database_name);
  
 -- SP_EXECUTESQL 中切换数据库不能当参数传入。
  
 --创建数据库角色db_procedure_execute
 SET @cmdText = 'USE ' + @database_name + ';' +CHAR(10)
  
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_procedure_execute'')
      BEGIN
       CREATE ROLE [db_procedure_execute] AUTHORIZATION [dbo];
      END ' + CHAR(10);
  
  
  
 --创建数据库角色db_function_execute
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_function_execute'')
      BEGIN
       CREATE ROLE [db_function_execute] AUTHORIZATION [dbo];
      END' + CHAR(10);
  
  
 --创建数据库角色db_view_table_definition
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_view_table_definition'')
      BEGIN
       CREATE ROLE [db_view_table_definition] AUTHORIZATION [dbo];
      END ' + CHAR(10);
  
 --创建数据库角色db_view_view_definition
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_view_view_definition'')
       BEGIN
       CREATE ROLE [db_view_view_definition] AUTHORIZATION [dbo];
       END ' + CHAR(10);
  
 --创建数据库角色db_view_procedure_definition
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_view_procedure_definition'')
      BEGIN
       CREATE ROLE [db_view_procedure_definition] AUTHORIZATION [dbo];
      END ' + CHAR(10);
  
  --创建数据库角色db_view_function_definition
 SELECT @cmdText += 'IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name =''db_view_function_definition'')
      BEGIN
       CREATE ROLE [db_view_function_definition] AUTHORIZATION [dbo];
      END ' + CHAR(10);
  
 --PRINT @cmdText;
 -- EXECUTE SP_EXECUTESQL @cmdText;
 EXECUTE (@cmdText);
  
  
  
 --给角色db_procedure_execute授权
  
 SET @cmdText ='USE ' + QUOTENAME(@database_name) + ';'
  
 SET @cmdText +='INSERT INTO #sql_text(sql_cmd)
     SELECT ''GRANT EXECUTE ON '' + SCHEMA_NAME(schema_id) + ''.''
      + QUOTENAME(name) + '' TO db_procedure_execute;''
      FROM sys.procedures s
      WHERE  NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_procedure_execute''))';
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  
  
  --给角色db_function_execute(标量函数授权)
  
  SET @cmdText ='USE ' + QUOTENAME(@database_name) + ';'
  
  SET @cmdText += 'INSERT INTO #sql_text(sql_cmd)
      SELECT ''GRANT EXEC ON '' + SCHEMA_NAME(schema_id) + ''.'' + QUOTENAME(name) + '' TO db_function_execute; ''
      FROM sys.all_objects s
      WHERE SCHEMA_NAME(schema_id) NOT IN (''sys'', ''INFORMATION_SCHEMA'')
      AND NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
            AND p.grantee_principal_id =USER_ID(''db_function_execute'') )
            AND ( s.[type] = ''FN''
              OR s.[type] = ''AF''
              OR s.[type] = ''FS''
              --OR s.[type] = ''FT''
             ) ;'
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  
  --给角色db_function_execute(表值函数授权)
  SET @cmdText ='USE ' + @database_name + ';'
  
  SET @cmdText += 'INSERT INTO #sql_text(sql_cmd)
      SELECT ''GRANT SELECT ON '' + SCHEMA_NAME(schema_id) + ''.'' + QUOTENAME(name) + '' TO db_function_execute;''
      FROM sys.all_objects s
      WHERE SCHEMA_NAME(schema_id) NOT IN (''sys'', ''INFORMATION_SCHEMA'')
       AND NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_function_execute''))
         AND ( s.[type] = ''TF''
          OR s.[type] = ''IF''
       ) ; '
  
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  --查看存储过程定义授权
  SET @cmdText ='USE ' + @database_name + ';'
  
  SET @cmdText +=' INSERT INTO #sql_text(sql_cmd)
      SELECT ''GRANT VIEW DEFINITION ON '' + SCHEMA_NAME(schema_id) + ''.''
      + QUOTENAME(name) + '' TO db_view_procedure_definition;''
      FROM sys.procedures s
      WHERE  NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_view_procedure_definition''))'
  
  EXECUTE(@cmdText);
  
  --查看函数定义的授权
  SET @cmdText ='USE ' + @database_name + ';'
  
  SELECT @cmdText += 'INSERT INTO #sql_text(sql_cmd)
       SELECT ''GRANT VIEW DEFINITION ON '' + SCHEMA_NAME(schema_id) + ''.''
       + QUOTENAME(name) + '' TO db_view_function_definition;''
       FROM sys.objects s
       WHERE type_desc IN (''SQL_SCALAR_FUNCTION'', ''SQL_TABLE_VALUED_FUNCTION'',
         ''AGGREGATE_FUNCTION'' )
         AND NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_view_function_definition''))';
  
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  --查看表定义的授权
  SET @cmdText ='USE ' + @database_name + ';'
  
  SET @cmdText +='INSERT INTO #sql_text(sql_cmd)
      SELECT ''GRANT VIEW DEFINITION ON '' + SCHEMA_NAME(schema_id) + ''.''
      + QUOTENAME(name) + '' TO db_view_table_definition ;''
      FROM sys.tables s
      WHERE NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_view_table_definition''))';
  
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  --查看视图定义的授权
  SET @cmdText ='USE ' + @database_name + ';'
  
  SET @cmdText +='INSERT INTO #sql_text(sql_cmd)
      SELECT ''GRANT VIEW DEFINITION ON '' + SCHEMA_NAME(schema_id) + ''.''
        + QUOTENAME(name) + '' TO db_view_view_definition; ''
      FROM sys.views s
      WHERE NOT EXISTS ( SELECT 1
            FROM sys.database_permissions p
            WHERE p.major_id = s.object_id
             AND p.grantee_principal_id = USER_ID(''db_view_view_definition''))';
  
  EXECUTE SP_EXECUTESQL @cmdText;
  
  
  
  WHILE 1= 1
  BEGIN
    
    
   SELECT TOP 1 @RowIndex=sql_id, @cmdText = 'USE ' + @database_name + '; '+ sql_cmd FROM #sql_text ORDER BY sql_id;
  
   IF @@ROWCOUNT =0
    BREAK;
  
   
   PRINT(@cmdText);
   EXECUTE(@cmdText);
  
   DELETE FROM #sql_text WHERE sql_id =@RowIndex
  
  
  END
   
    
  DELETE FROM #databases WHERE database_name=@database_name;
END
   
  DROP TABLE #databases;
  DROP TABLE #sql_text;
  
END

 

转载于:https://www.cnblogs.com/scwbky/p/10026938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之xargs命令用途

实现文件删除的方法大致有以下几种:1.rm find /a -type f 2.find /a -type f -exec|-ok rm -rf { } \;3.find /a -type f -exec|-ok rm -rf { } ;本例中xargs将find产生的长串文件列表拆散成多个子串,然后…

什么是U-Boot以及如何下载U-Boot源码

参考:什么是U-Boot以及如何下载U-Boot源码? 作者:一只青木呀 发布时间: 2020-10-20 11:05:59 网址:https://blog.csdn.net/weixin_45309916/article/details/109176510 目录前言系统的启动过程uboot简介uboot源码下载选…

linux系统重装win系统教程,Win10如何重装linux系统 Win10重装linux系统教程

Windows10如何重装linux系统?下面小编就给大家介绍一下Win10重装linux系统教程。1、我们按下wini打开设置 后点击【更新和安全】->【windows更新】;2、我们在左侧点击【针对开发人员】,在右侧点击【发开人员模式】;3、我们按winx键->选择【程序和功能】;4、我…

Uboot初次编译、烧写、启动(启动界面log简析)

目录U-Boot 初次编译U-Boot 烧写与启动上述笔记第三点就是建立shell脚本实现的 第四点就是修改Makefile文件实现的,下面均有实现步骤讲解。 U-Boot 初次编译 先编译体验一下正点原子提供的UBOOT。 首先在Ubuntu 中安装ncurses 库,否则编译会报错&#…

360 linux 扩展文件夹,360签具名工Linux下载0907 官方版

腾牛网提供的这款360签名工具Linux版,共有两个版本,分别是图形界面版和命令行界面版,两种选择为apk签名具有一样的正版效果。相关下载:360加固助手pc端Linux签名工具使用流程(图形界面)使用方法:一、准备工作&#xff…

锁优化

前言 高效并发是从JDK1.5到JDK1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等,这些技术都是为了在线程之间高效的共享数据,以及解…

WPF--ComboBox数据绑定

0-在ComboBox中显示图片&#xff1a; <ComboBox Height"33" HorizontalAlignment"Right" Margin"0,94,31,0" x:Name"comboBox1" VerticalAlignment"Top" Width"142" SelectedIndex"0"> <Co…

U-Boot源码目录分析(VScode工程创建及文件夹过滤)

参考&#xff1a;U-Boot工程目录介绍 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-21 14:47:30 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109199081 目录0、Uboot下载编译VScode工程创建及文件夹过滤2、重要文件2.1、arch文件夹&…

Spring Security 案例实现和执行流程剖析

在线演示 演示地址&#xff1a;http://139.196.87.48:9002/kitty 用户名&#xff1a;admin 密码&#xff1a;admin Spring Security Spring Security 是 Spring 社区的一个顶级项目&#xff0c;也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证&#xff08;Authentica…

Ubuntu用户与用户组

目录Ubuntu用户与用户组创建用户和用户组Ubuntu用户与用户组 创建用户和用户组

linux执行windows创建的脚本,如何在Windows 10上创建和运行Bash Shell脚本 | MOS86

随着Windows 10的到来您还可以将Bash命令合并到Windows批处理文件或PowerShell脚本中。如果你知道你是什么Windows和UNIX使用不同的行尾字符&#xff0c;Windows文件系统可以在Bash环境的不同位置访问。如何在Windows上编写一个Bash脚本10当在Windows上编写shell脚本时&#xf…

31 锁,信号量,事件,队列

1.同步锁&#xff08;互斥锁&#xff09; from mutilprocessing import Lock 方式一&#xff1a; lockLock() lock.acquire() 数据操作的代码 lock.release() 方式二&#xff1a; with lock: 数据操作代码2.信号量 from mutilprocessing import …

Ubuntu下文件权限管理

参考&#xff1a;Ubuntu / Linux 下文件权限管理 作者&#xff1a;~莘莘 发布时间&#xff1a; 2021-07-12 17:09:48 网址&#xff1a;https://blog.csdn.net/lcx1837/article/details/118676383?spm1001.2014.3001.5501 目录一、文件权限二、修改文件权限一、文件权限 文件权…

U-Boot顶层Makefile分析

参考&#xff1a;U-Boot顶层Makefile介绍 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-22 16:22:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109218569 目录0、学习目的1、准备好uboot源码2、分析顶层Makefile2.1、版本号2.2、M…

思科路由器的硬件组成

思科路由器的硬件组成常建议常建议CCNA的学员们&#xff0c;除了能灵活配置与应用思科的路由器和交换机以外&#xff0c;还需要掌握对路由器与交换机的常规维护工作&#xff0c;比如IOS的安装与升级&#xff0c;这个过程好比为一台全新的计算机安装操作系统&#xff0c;在此之前…

linux gone kde 图形程序 兼容,Oracle8i HowTo

现在假设你要在Linux上安装Oracle服务器,请先过以下5关&#xff1a;系统要求规划硬盘创建用户创建目录设置参数1.系统要求前提条件是能够安装运行Linux&#xff0c;然后应满足以下硬件要求&#xff1a;内存 RequirementsMemory  最小要求128 MB RAM.更多(256MB)内存可以提…

U-Boot启动流程详解

参考&#xff1a;U-Boot顶层目录链接脚本文件&#xff08;u-boot.lds&#xff09;介绍 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-23 13:52:23 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109240625 目录链接脚本 u-boot.lds 详解…

linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)

CentOS(linux) 下Nginx的安装(NginxTomcat集群)CentOS 7.4(腾讯云)pcre库zlib库opensslNginx服务器安装gcc g开发类库yum -y install gcc automake autoconf libtool makeyum install gcc gcc-cwget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz解压pcre库tar -zxvf pcre-8…

在线生成透明ICO图标神器

此神器的链接为&#xff1a;http://ico.duduxuexi.com/ 大家可以将这个网址收藏好&#xff0c;本人亲测十分好用&#xff01;对我们的ios,安卓以及windows开发都有极大的好处。转载于:https://www.cnblogs.com/geeksongs/p/10040935.html

Vim的使用和快捷键介绍

参考&#xff1a;Linux–Vim的使用以及快捷键大全 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-12 12:43:19 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107297756 目录安装vim三种常用的模式三种常用模式的切换vim 快捷键1.一般模…