最近在项目中某个功能遇到了阻塞造成的Time out错误。所以需要在执行该功能的时候开启一个线程检测SQL Server中阻塞会话。但是程序本身使用的sql帐号本身不具备VIEW Sever State权限。这个权限是sys_admin角色的。所以就需要使用证书将View Server State权限赋予给普通账号。

在开发之前找到了以下两篇博文参考:

SQL Server 2005: 存储过程签名 - stswordman - 博客园
http://www.cnblogs.com/stswordman/archive/2008/07/29/1255322.html

这一篇使用了master key. 当数据库备份后, 在其他数据库还原时需要master key.

Pitching Pebbles - Using Certificates to Grant Privileges | ColleenMorrow.com
http://colleenmorrow.com/2011/12/19/tossing-pebbles-using-certificates-to-grant-privileges/

这一篇直接使用的证书的密钥做. 没有前一篇master key带来的问题. 只是示例使用的是master库.以及直接赋予的sys_admin角色的权限.

本人结合两篇博文的要点,采用证书密码的方式授予View Server State权限。

以下是代码

新建一个查看阻塞进程的存储过程:

USE [TestDB]
GO CREATE PROC [dbo].[sp_CheckBlockSession]
AS
WITH CTE_SID ( BSID, SID, sql_handle )
AS ( SELECT blocking_session_id ,
session_id ,
sql_handle
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
UNION ALL
SELECT A.blocking_session_id ,
A.session_id ,
A.sql_handle
FROM sys.dm_exec_requests A
JOIN CTE_SID B ON A.SESSION_ID = B.BSID
)
SELECT C.BSID AS blocking_session_id,
C.SID AS session_id,
S.login_name ,
S.host_name ,
S.status ,
S.cpu_time ,
S.memory_usage ,
S.last_request_start_time ,
S.last_request_end_time ,
S.logical_reads ,
S.row_count ,
q.text
FROM CTE_SID C
JOIN sys.dm_exec_sessions S ON C.sid = s.session_id
CROSS APPLY sys.dm_exec_sql_text(C.sql_handle) Q
ORDER BY sid

新建一个最小权限账户

USE TestDB
GO
--新建一个最小权限账户
CREATE LOGIN TEST_View WITH PASSWORD = '';
CREATE USER TEST_View FOR LOGIN Test_View
--让该账户有权限执行存储过程dbo.sp_CheckBlockSession
GRANT EXECUTE ON sp_CheckBlockSession TO Test_View

测试最小权限账户执行sp_CheckBlockSession

EXECUTE AS LOGIN = 'TEST_View' ;
EXEC sp_CheckBlockSession
REVERT ;
--错误消息
消息 297,级别 16,状态 1,过程 sp_CheckBlockSession,第 3 行
用户没有执行此操作的权限。
USE TestDB
GO
--创建证书以及授权
CREATE CERTIFICATE certSignCheckBlockSession_1 ENCRYPTION BY PASSWORD ='TEST111' WITH SUBJECT = 'for signing procedure sp_CheckBlockSession', EXPIRY_DATE='2025-10-10' ;
-- sp_CheckBlockSession
ADD SIGNATURE TO sp_CheckBlockSession BY CERTIFICATE certSignCheckBlockSession_1 WITH PASSWORD = 'TEST111' ;
BACKUP CERTIFICATE certSignCheckBlockSession_1 TO FILE = 'certSignCheckBlockSession_1.cer' ; USE master
GO
CREATE CERTIFICATE certSignCheckBlockSession_1 FROM FILE = 'certSignCheckBlockSession_1.cer' ; -- 创建登录并映射到证书
CREATE LOGIN L_TESTVIEW FROM CERTIFICATE certSignCheckBlockSession_1 ;
-- 通过授权映射登录的方式将ALTER ANY LOGIN权限赋给证书
GRANT VIEW SERVER STATE TO L_TESTVIEW ;
--测试最小权限账户权限
USE TestDB
GO
EXECUTE AS LOGIN = 'TEST_View' ;
EXEC sp_CheckBlockSession
REVERT ;--成功得到结果, 不再提示用户没有此操作权限.

以上是使用证书签名存储过程的全部过程. 可以实现最小粒度权限的赋予。这样在生产环境中,就避免了赋予不必要的管理权限。降低风险!

注意事项:证书备份路径的问题. 如果没有指定绝对路径。则备份文件在D:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA(楼主的机器)目录下面。这个目录有可能权限不足而无法备份到里面。本来我想使用绝对路径的。但是由于我开发某个项目时,使用了一个功能造成我当前账户的权限被缩小到很小。无法使用绝对路径进行备份,所以才使用了默认路径。各位做测试的话要注意这个问题。

SQL Server使用证书最小粒度授权的更多相关文章

  1. SQL Server 镜像证书过期处理

    转自:https://www.cnblogs.com/trams/archive/2012/01/13/2321637.html SQL Server 镜像证书过期处理 今天镜像中的主服务器进行维护重 ...

  2. SQL Server时间粒度系列----第1节时间粒度概述

    本文目录列表: 1.什么是时间粒度?2.SQL Server提供的时间粒度3.SQL Server时间粒度代码演示   4.SQL Server基准日期 5.总结语6.参考清单列表   什么是时间粒度 ...

  3. SQL Server时间粒度系列----第2节日期、周时间粒度详解

    本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表   从My ...

  4. SQL Server时间粒度系列----第3节旬、月时间粒度详解

    本文目录列表: 1.SQL Server旬时间粒度2.SQL Server月有关时间粒度 3.SQL Server函数重构 4.总结语 5.参考清单列表   SQL Server旬时间粒度       ...

  5. 第三篇 SQL Server安全主体和安全对象

    本篇文章是SQL Server安全系列的第三篇,详细内容请参考原文. 一般来说,你通过给主体分配对象的权限来实现SQL Server上的用户与对象的安全.在这一系列,你会学习在SQL Server实例 ...

  6. 【译】第三篇 SQL Server安全主体和安全对象

    本篇文章是SQL Server安全系列的第三篇,详细内容请参考原文. 一般来说,你通过给主体分配对象的权限来实现SQL Server上的用户与对象的安全.在这一系列,你会学习在SQL Server实例 ...

  7. 转:sql server锁知识及锁应用

    sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...

  8. SQL SERVER锁(LOCK)知识及锁应用

    提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的 ...

  9. 第7讲:SQL Server简介

    SQL Server是微软公司提供的一款关系数据库管理系统. 操作数据库有两种方式:SQL语句和可视化的SSMS,该文章所有操作均基于SSMS. 一.SSMS(SQL Server Managemen ...

随机推荐

  1. 2101244 - FAQ: SAP HANA Multitenant Database Containers (MDC)

    Symptom You face issues or have questions related to multitenant database containers in SAP HANA env ...

  2. 手写注解实现SpringMVC

    参考:https://www.cnblogs.com/Shock-W/p/6617068.html

  3. 30个php操作redis常用方法代码例子(转载)

    1.connect 描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE示例: $redis = new red ...

  4. prim及其练习

    关于prim,其实我今天才学... prim其实就是最小生成树的一种算法,严格每次的找最小边连到树上.看书上的代码看不懂,于是就自己大胆用堆优化写prim. 搞了很长时间,经过不写努力,还是搞出来了. ...

  5. 计算机系统的通信PPT版本

    通信方式 并行传送:一次8位,需要保持各路信号同时到达,距离和速度受限制,成本较高 串行传送:一次1位,距离较远.速率更高,成本较低. {在单片机的通信中,使用的是串行传送,但是数据寄存器里面的是8位 ...

  6. Linux ssh命令

    SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息. ...

  7. hello1以及hello2的部分代码分析

    (一)1.GreetingServlet.java源码文件: @WebServlet("/greeting") //以@WebServlet注释开头,注释指定相对于上下文根的URL ...

  8. Unity之AssetBundle打包

    AssetBundle Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resource ...

  9. 简化Getter 与 Setter 的插件 Lombok

    参考文档:https://www.jianshu.com/p/365ea41b3573 第一步:添加依赖 <dependency> <groupId>org.projectlo ...

  10. 模型介绍之FastText

    模型介绍一: 1. FastText原理及实践 前言----来源&特点 fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新.但是它的优点也 ...