日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 2005: 存储过程签名

發布時間:2023/12/1 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 存储过程签名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。