展示如何用证书签名一个存储过程
2013-01-18 14:54
218 查看
-- 目的
-- 展示如何用证书签名一个存储过程,
--并授予证书相应的权限
create
database demo;
go
-- 创建一个存储过程,该过程会创建一个主体(包含登录和用户)
-- 这需要服务器级别的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;
'Cannot create login'
return;
end
-- create user
set
@sqlcmd
=
'create user '
+
quotename(@name);
exec (@sqlcmd);
if
@@error
<>
0
begin
rollback
tran;
'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;
select * from sys.master_key_passwords
-- 使用证书对存储过程进行签名
-- 首先我们要创建一个数据库主密钥(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
='C:\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
=
'C:\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';
exec sp_CreatePrincipal 'bob', 'Apufe@))%';
revert;
select * from sysusers
-- 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 : 如何完全复制一个服务器上的数据库A到另一个服务器上的数据库B(包括库A的所有表、试图、存储过程等等)
- 如何编写一个模糊查询的存储过程
- 如何创建一个简单的JAVA存储过程?[转贴]
- 如何删除一个表中重复的记录? 、、游标,存储过程的使用
- mysql如何让一个存储过程定时执行
- 获取手机内外部存储空间的参数 && 如何决定一个apk的安装位置 && APK安装过程及原理详解
- mysql如何在一个存储过程中使用另外一个存储过程的结果集
- 如何创建一个简单的JAVA存储过程?[转贴]
- 如何分析一个存储过程的性能
- 如何在SQL Server中搜索到一个带有某关键字的存储过程?
- 如何把多条语句统计的结果集 用一个存储全部展示
- 存储过程有输出参数,在c#中用nhibernate调用存储过程时,如何才能获取到一个结果集和这个输出参数呢?
- 如何编写一个带模糊查询的存储过程
- oracle如何在一个存储过程中调用另一个返回游标的存储过程
- 再来一个分页的存储过程,这可比别的好多了,就是不知速度如何!
- c++ 如何使用CryptoAPI创建一个自签名证书
- 如何创建一个简单的JAVA存储过程
- Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环
- 如何得到任意一个存储过程的参数列表的
- mysql如何让一个存储过程定时执行