我对以下行为感到困惑:我有一个MS SQL Server实例,其中有两个数据库DB_A
,DB_B
和登录名own_dba
和own_dbb
,分别是用户和成员各自数据库的db_owner
角色中的位置。他们对其他各自的数据库没有任何权限。
现在,出于测试原因,我希望own_dba
通过执行存储过程DB_B
来调用sp_dba
上的视图。我希望通过使用模块签名来实现。我基本上遵循了以下说明: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
(在SELECT
中的某些视图上基本上只是一个DB_B
语句),它向我显示了视图的内容。>
让我感到奇怪的是,在上面的代码中,我根本忘记授予用户Acc_Dbb
任何权限,但是效果很好。到目前为止,据我在互联网上找到的信息,我应该向用户授予足够的权限。证书(带私钥)是否为用户提供默认权限?
我认为,系统中可能存在错误。在我的第一次尝试中,我已经创建了用户Acc_Dbb
,并使其成为db_owners
的成员。但是我在第一次尝试后就删除了该用户。另外,在我这里提到的第二次尝试中,未将用户标记为db_owners
的成员(或db_owners
的所有者)...
感谢您对此事提出任何想法! 最好的问候!
答案 0 :(得分:0)
好吧,答案很简单:默认情况下,public
角色对数据库的所有对象都具有SELECT
权限(我认为这是一个奇怪的默认设置)。因此,用户Acc_DBB
(是public
的成员)被允许在视图上执行SELECT
,但不允许执行UPDATE
或INSERT
。>