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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的SQL Server 2005: 存储过程签名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿促排卵针打多久?
- 下一篇: 宫颈多囊是什么原因导致的?需要治疗吗?