经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » MS SQL Server » 查看文章
SQL Server中通用数据库角色权限处理
来源:cnblogs  作者:潇湘隐者  时间:2018/9/30 10:53:21  对本文有异议

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

 

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

 

clip_image001

 

 

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

 

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

 

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

 

 

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

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

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号