我正在尝试使用已为SP签名的证书设置的权限,允许模拟的存储过程访问其他数据库中的视图。
数据库A
数据库B:
我的DatabaseA有一些特权用户,这些用户可以做很多事情,我们称其中一个为“ SuperUser”。对于他们来说,一个用户也存在于DatabaseB中,因此他们访问DatabaseB中公开的视图没有问题。
现在,我创建了一个非常有限的用户,我们将其称为“ StupidUser”,该用户仅对DatabaseA.GetData SP具有执行权限。为了避免也授予SELECT或其他权限,我创建了SP WITH EXECUTE AS 'SuperUser'
在查询访问另一个数据库之前,一切都很好:
The server principal "SuperUser" is not able to access the database "DatabaseB" under the current security context.
Erland Sommarskog's blog对成为我的圣经进行了一些研究,发现所有权链接是罪魁祸首。
因此,我尝试使用DatabaseA中的证书对SP进行签名:
CREATE CERTIFICATE AccessResourcesReadOnly
ENCRYPTION BY PASSWORD = 'veryComplicatedPassword'
WITH SUBJECT = 'AccessResourcesReadOnly', EXPIRY_DATE = '2029-01-31T00:00:00'
ADD SIGNATURE TO [dbo].[GetData] BY CERTIFICATE AccessResourcesReadOnly WITH PASSWORD = 'veryComplicatedPassword'
现在,我正在尝试为暴露的视图在DatabaseB中添加具有“连接/选择”权限的证书用户。正在运行
CREATE USER AccessResourcesFromCertificateReadOnly
FROM CERTIFICATE AccessResourcesReadOnly;
“ DatabaseB”中的结果
Cannot find the certificate 'AccessResourcesReadOnly', because it does not exist or you do not have permission.
相反,在“ master”中创建证书没有帮助;我尝试过,然后在DatabaseA中找不到ADD SIGNATURE TO dbo.GetData
或DatabaseB中找不到CREATE USER FROM CERTIFICATE
的证书名称。
我究竟做错了什么?如何以允许SP访问DatabaseA.GetData
的方式对DatabaseB.ExposedView
进行签名?
答案 0 :(得分:1)
您应该将其export certificate
和import
放入DatabaseB
,您的证书应该同时存在于两个数据库中,因为现在您仅在DatabaseA
中拥有它,这就是为什么您得到< / p>
找不到证书“ AccessResourcesReadOnly”,因为它确实 不存在
引用博客的完整解决方案是:
P.S。对于您来说,简单的cross database chaining
也可以。