【发布时间】:2018-08-21 19:44:22
【问题描述】:
我对以下行为感到困惑:我有一个 MS SQL Server 实例,其中包含两个数据库 DB_A、DB_B 和登录 own_dba 和 own_dbb,它们是用户和 db_owner 角色的成员各自的数据库。他们对其他各自的数据库没有任何权限。
现在,出于测试原因,我希望own_dba 通过执行存储过程sp_dba 来调用DB_B 上的视图。我希望通过使用模块签名来实现这一点。我基本上遵循了这里的说明:https://dba.stackexchange.com/questions/86424/sql-server-chain-permission/86437#86437tsql
我所做的(通过使用 SysAdmin 帐户)是
USE DB_B
CREATE CERTIFICATE Acc_DBB_Cert
ENCRYPTION BY PASSWORD = 'MySuperPwd!'
WITH SUBJECT = 'Certificate to access DB_B.',
EXPIRY_DATE = '20201031';
GO
CREATE USER Acc_Dbb
FROM CERTIFICATE Acc_DBB_Cert
GO
BACKUP CERTIFICATE Acc_DBB_Cert TO FILE = 'd:\MyCertFolder\Acc_DBB_Cert'
WITH PRIVATE KEY ( FILE = 'd:\MyCertFolder\Acc_DBB_Cert_Key' ,
DECRYPTION BY PASSWORD = 'MySuperPwd!',
ENCRYPTION BY PASSWORD = 'MySuperPwd!' );
GO
USE DB_A
CREATE CERTIFICATE Acc_DBA_Cert FROM FILE = 'd:\MyCertFolder\Acc_DBB_Cert'
WITH PRIVATE KEY ( FILE = 'd:\MyCertFolder\Acc_DBB_Cert_Key' ,
DECRYPTION BY PASSWORD = 'MySuperPwd!',
ENCRYPTION BY PASSWORD = 'MySuperPwd!');
GO
ADD SIGNATURE TO [dbo].[sp_dba]
BY CERTIFICATE Acc_DBB_Cert WITH PASSWORD = 'MySuperPwd!'
GO
我该说什么,它工作得很好。我可以以own_dba 登录,执行sp_dba(基本上只是DB_B 中某个视图上的SELECT 语句),它会显示视图的内容。
让我感到奇怪的是,在上面的代码中,我根本忘记向用户 Acc_Dbb 授予任何权限,但它工作正常。就我在互联网上找到的信息而言,我应该向用户授予足够的权限。证书中的用户是否有默认权限(使用私钥)?
我想,系统中可能存在错误。在我的第一次尝试中,我已经创建了用户 Acc_Dbb 并使他成为 db_owners 的成员。但是我在第一次尝试后放弃了这个用户。另外,在我这里提到的第二次尝试中,用户没有被标记为db_owners 的成员(或db_owners 的所有者)......
感谢您对此事的任何想法! 最好的问候!
【问题讨论】:
-
可能是所有权链接。
SELECT SUSER_SNAME(owner_sid), name, is_db_chaining_on, is_trustworthy_on FROM sys.databases WHERE name IN(N'DB_A', N'DB_B');的结果是什么。 -
嗨,丹,感谢您的回答。不,既没有激活 tustworhtyness 也没有激活所有权链接。事实上,我找到了答案;)
标签: sql-server tsql permissions certificate signing