SQL Server 2005: 存储过程签名

 

 

SQLSERVER 2005提供的对存储过程签名(signature)功能是我最喜欢的。

 

如果我们要编写一个存储过程,执行该存储过程里的代码需要权限P,并且我们想要用户Alice可以执行这个存储过程,但是我们不想将权限P直接赋予给用户Alice 我们可以用证书(certificate)对这个存储过程进行签名来完成这一需求:

 

a)      如果P是一个数据库级别的权限,那我们可以在相应的数据库中创建一个证书,使用证书创建一个用户(user),然后将权限p授权给这个用户

b)      如果P是一个服务器级别的权限,那我们能要在master数据库中创建一个证书,使用证书创建一个登录(login),然后将权限P授权给这个登录

 

  签名之后,存储过程就会在执行期间获得权限P,而我们仅仅授予了Alice执行这个存储过程的权限。

 

     如果我们既需要服务器级别的权限,又需要数据库级别的权限,那么我们既要创建用户,又要创建登录。下面列出步骤:

 

1)      在数据库中创建证书

2)      创建一个用户(user)并映射到这个证书

3)      将数据库级别的权限授予这个用户

4)      备份这个证书

5)      master数据库中还原这个证书

6)      创建一个登录(login),并将登录映射到证书

7)      将服务器级别的权限授予给这个登录

 

  我们也可以先在master数据库中创建证书,然后再将其还原到用户alice工作的数据库。也就是证书的创建顺序并不重要,重要的是master数据库中的证书一定要和用户数据库中的相同。

 

下面是演示:

 

 

-- 目的
--
 展示如何用证书签名一个存储过程, 
--
并授予证书相应的权限

 

create database demo;

use demo;

 

-- 创建一个存储过程,该过程会创建一个主体(包含登录和用户)
--
 这需要服务器级别的ALTER ANY LOGIN 权限
--
 和数据库级别的 ALTER ANY USER 权限
create procedure sp_CreatePrincipal
      
@name varchar(256),
      
@password varchar(128)
as
   
declare @sqlcmd varchar(2000);

 

   
begin tran;

 

   
-- create login
   set @sqlcmd = 'create login ' + quotename(@name+ ' with password = ' + quotename(@password'''');
   
exec (@sqlcmd);
   
if @@error <> 0

   
begin

      
rollback tran;
      
print 'Cannot create login'
      
return;
   
end

 

   
-- create user
   set @sqlcmd = 'create user ' + quotename(@name);
   
exec (@sqlcmd);
   
if @@error <> 0
   
begin
      
rollback tran;
      
print 'Cannot create user'
      
return;
   
end

 

   
commit tran;
go

 

-- 调用这个存储过程
--
 创建主体
sp_CreatePrincipal 'alice''Apufe@))%';

 

--我们需要让alice可以调用这个存储过程,创建新的主体, 
--
 但并不直接授予她权限(创建主体的权限,译者注)
grant execute on sp_CreatePrincipal to alice;

 

-- 目前 alice还不能创建主体
execute as login = 'alice';
sp_CreatePrincipal 
'bob''Apufe@))%';
revert;

 

-- 使用证书对存储过程进行签名
--
 首先我们要创建一个数据库主密钥(database master key)
create master key encryption by password = 'Apufe@))%';
create certificate certSignCreatePrincipal with subject = 'for signing procedure sp_CreatePrincipal';

 

-- 签名存储过程sp_CreatePrincipal
add signature to sp_CreatePrincipal by certificate certSignCreatePrincipal;

-- 现在签名完成了,可以将证书的私钥移除了
alter certificate certSignCreatePrincipal remove private key;

-- 对证书进行备份,随后在master数据库中将要使用该备份
backup certificate certSignCreatePrincipal to file = 'certSignCreatePrincipal.cer';

 

-- 创建一个用户并将用户映射到证书
create user u_certSignCreatePrincipal from certificate certSignCreatePrincipal;
--通过授权映射映射的方式将ALTER ANY USER权限赋给证书  (因为用户和证书是映射的,所以权限也就赋给了证书,SQLSERVER本身没有直接将权限赋给证书的方法。译者注)
grant alter any user to u_certSignCreatePrincipal;

 

-- 在master数据库中创建该证书
use master;
create certificate certSignCreatePrincipal from file = 'certSignCreatePrincipal.cer';

-- 创建登录并映射到证书
create login l_certSignCreatePrincipal from certificate certSignCreatePrincipal;
-- 通过授权映射登录的方式将ALTER ANY LOGIN权限赋给证书
grant alter any login to l_certSignCreatePrincipal;

 

-- 完成!
use demo;

 

-- 验证一下,master数据库中的证书和demo数据库中的证书是一样的。
select c.name from sys.certificates c, master.sys.certificates mc where c.thumbprint = mc.thumbprint;

 

-- 现在alice可以创建主体了
execute as login = 'alice';
sp_CreatePrincipal 
'bob''Apufe@))%';
revert;

 

-- cleanup
drop user u_certSignCreatePrincipal;
drop login l_certSignCreatePrincipal;
drop procedure sp_CreatePrincipal;
drop certificate certSignCreatePrincipal;
drop user alice;
drop login alice;
drop user bob;
drop login bob;

 

use master;

drop certificate certSignCreatePrincipal;
drop database demo;
-- EOD

 

原文: SQL Server 2005: procedure signing demo

转载于:https://www.cnblogs.com/stswordman/archive/2008/07/29/1255322.html

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

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

相关文章

手机能上wifi电脑不行_锦囊在此(电脑手机如何配置使用WIFI)

1.路由器接入电源(以下是以TP-LINK为例&#xff0c;其他路由器大同小异&#xff0c;重要是在于关闭DHCP服务器选项)2.打开电脑WIFI连接路由器(找对路由器名称&#xff0c;见路由器底标)(建议不要接入网线&#xff0c;配置好再接入网线)3.打开浏览器输入路由器后台网址(见路由器…

2013_changsha_onsite

4791 Alices Print Service 水&#xff0c;把价格处理出来然后二分。 4792 Bobs new toy 4793 Collision 带入两个方程&#xff0c;解一下就行了。 4794 Arnold 稍微转化一下&#xff0c;变成斐波那契%n的循环节&#xff0c; 4795 Easy …

【转】Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁

锁有两种分类方法。&#xff08;1&#xff09; 从数据库系统的角度来看锁分为以下三种类型&#xff1a; 独占锁&#xff08;Exclusive Lock&#xff09; 独占锁锁定的资源只允许进行锁定操作的程序使用&#xff0c;其它任何对它的操作均不会被接受。执行数据更新命令&#xff0…

8位可控加减法电路设计_100以内数的认知也加减法详解

一、100 以内数的认识1、10个十是100,读作一百。100 是由10个十或100个一组成,它是一个三位数。2、数数时,可以一个一个的数,也可以二个二个的数,五个五个的数,十个十个的数。3、从右边起,第一位是个位,第二位是十位,第三位是百位。4、读数和写数,都从高位起。当计数器上个位或…

2013_nanjing_onsite

4802 GPA 签到题目。 4803 Poor Warehouse Keeper 优先考虑增长较快的上键&#xff0c;贪心即可。 4804 Campus Design 插头dp&#xff0c;加一维表示1*1的个数。 4805 Shoot 4806 Circular Lamps 4807 Lunch Time 480…

如何在电脑上截屏_如何在电脑上截图?教你6种常用的截图方法,总有你不知道的...

无论是在学习上还是在工作中&#xff0c;我们都经常会用到电脑&#xff0c;特别是在工作中&#xff0c;每天都是与电脑相伴&#xff0c;遇到重要的文字信息或者好看的图片&#xff0c;都会想尽办法截取下来&#xff0c;所以今天就教大家几种电脑截图的方法。1、截图工具这个截图…

U盘的RUNAUTO..文件的删除

在u盘上看到一个runauto..文件和文件夹(隐藏属性&#xff09;&#xff0c;用正常的删除方法的无法删除的&#xff0c;遇到这样的情况&#xff0c;很多人会选择格式化u盘&#xff0c;但这样会对盘的使用寿命受到影响&#xff0c;而且不方便。 如果是在一个很大的存储硬盘&#x…

2016_shengyang_onsite

5948 Thickest Burger 签到&#xff0c;abmax(a,b) 5949 Relative atomic mass 签到&#xff0c;数组统计一下 5950 Recursive sequence 矩阵快速幂&#xff0c;推出(n1)^4与n^4的关系&#xff0c;7*7矩阵 5951 Winning an Auction 5952 …

Ext整体印象

老婆一不在身边&#xff0c;我的熬夜的瘾就发作了。我要在今晚对Ext的代码进行深入的全面的观察学习&#xff0c;以便于在下周的技术交流活动中对大家做出我理解的表达&#xff0c;避免大家走更多的弯路&#xff0c;我要做一个真正的履行者。 其实国内不乏有自己开发自己框架的…

HDU 5950——Recursive sequence

Recursive sequence 题意&#xff1a;给定起始的两个数a,b&#xff0c;求第n个数%mod 思路&#xff1a; 第一眼看出来是矩阵快速幂&#xff0c;不过当时没推出来&#xff08;其实推了一半把自己给否定了&#xff09; 正解是&#xff0c;根据二项式定理&#xff0c;对于f(n)…

ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

第三章 为控件添加事件 好了&#xff0c;我们之前以前开发一个控件。而且也添加了属性&#xff0c;开发也很规范&#xff0c;但是那个控件还差最后一点&#xff1a;添加事件。 系列文章链接:ASP.NET自定义控件组件开发 第一章 待续ASP.NET自定义控件组件开发 第一章 …

pioneer dvr-xd50 固件_闲的蛋疼的验证:索尼 SONY WH1000XM3固件版本差异

坊间一直流传&#xff0c;索尼WH-1000XM3的新固件版本降噪性能要比老的更差&#xff0c;即最早期的2.x.x版本的降噪性能要比目前的4.x.x更好。这也让不少WH-1000XM3的用户一直停留在2.x版本不升级&#xff0c;甚至动用比较麻烦的方法去对耳机做固件降级。出于闲的蛋疼的原因&am…

python接口测试_Python接口自动化测试(一)

本节开始&#xff0c;开始介绍python的接口自动化测试&#xff0c;首先需要搭建python开发环境&#xff0c;到https://www.python.org/下载python版本直接安装就以了&#xff0c;建议下载python2.7.11版本&#xff0c;当然&#xff0c;也是可以下载python最新版本。 接口测试是…

2016_icpc_dalian_onsite

5971 Wrestling Match 把开始的边固定&#xff0c;然后分别枚举&#xff0c;dfs染色即可。 5972 Regular Number 5973 Game of Taking Stones 威佐夫博奕&#xff0c;用java写大数即可。 5974 A Simple Math Problem 可以把gcd(x,y)当成常…

心得 如何优雅地跨线程修改主线程窗口控件

编程环境要求&#xff1a;VS2008/FX2.0 众所周知&#xff0c;从VS2005/FX2.0起&#xff0c;在多线程环境下是不允许跨线程修改主线程上窗口控件的。 例如&#xff1a; privatevoidbutton1_Click(objectsender, EventArgs e) { Thread t newThread(newThreadStart(CrossThre…

刷recovery工具apk_红米note4X刷lineage,不喜欢miui10广告臃肿的可以试一试

经常在miui和各个类原生安卓系统间换来换去&#xff0c;不过miui10现在是越来越垃圾了&#xff0c;广告、耗电、臃肿&#xff0c;我现在已经逐步抛弃miui了&#xff01;小白可以看我的帖子做个参考&#xff0c;刷机其实是特别简单的是&#xff0c;只要一步步来&#xff0c;总会…

关于弹框

confirm("提示字串") 为一个询问视窗,选确定传回true 否则传回false <a href"网页参数" onClick"return confirm(确认要删除吗?)"> 如果按确定就回车true ,onClick事件成立,就传送参数到删除网页进行删除 否则就没有任何动作 转载于:http…

poj 3710——Christmas Game

题意&#xff1a; 给定多个无向有环图&#xff0c;两个人在树上博弈&#xff0c;问博弈结果。 思路&#xff1a; 如果没有环&#xff0c;则是一个标准的树上博弈&#xff0c;那么满足 1. 叶子节点的sg为0 2. 中间节点的sg为所有儿子节点的sg1的异或和 存在环的话&#xf…

干涉测量技术的应用_技术分享 | 石化行业测量仪表应用在线答疑

众所周知&#xff0c;在化工和石化这类流程行业当中&#xff0c;稳定性和持续性是至关重要的生产“命脉”&#xff0c;对于生产过程中使用的测量仪表有着极其严格的要求。不仅所有测量仪表都必须满足严苛的国际标准&#xff0c;如PED和ATEX&#xff0c;压力、温度及液位等电子和…