模块签名-消息916,服务器主体无法在当前安全上下文下访问数据库

时间:2019-05-16 15:51:00

标签: sql-server tsql stored-procedures sql-server-2008-r2 certificate

我正在使用模块签名概念,并尝试执行证书签名的存储过程[master].[dbo].[sp_kill]。我可以使用[sys].[crypt_properties]验证proc是否已签名。从证书创建的登录名具有[sysadmin]服务器角色。使用以下查询向所有用户授予EXECUTE权限:-

GRANT EXECUTE ON sp_Kill TO [public]

仍然,当尝试使用具有CONNECTVIEW ANY DATABASE权限的低特权SQL登录名执行该过程时,出现错误

  

消息916,级别14,状态1,过程sp_Kill,第38行[批处理开始第0行]
  服务器主体“ Ajay”在当前安全上下文下无法访问数据库“ DBA”。

过程[master]..[sp_kill]引用了另一个数据库[DBA]上的表。

下面是[sp_kill]的代码:-

CREATE PROCEDURE dbo.sp_Kill @p_SpId SMALLINT = NULL
AS
BEGIN
    IF OBJECT_ID('DBA..AuthorizedSessionKiller') IS NULL
    BEGIN
        CREATE TABLE DBA.dbo.AuthorizedSessionKiller(ID INT IDENTITY(1,1), IsDbLevelPermission BIT NOT NULL DEFAULT 1, DbName varchar(125) NULL, LoginName varchar(125) NOT NULL, AddedBy varchar(125) NOT NULL, AddedOn datetime NOT NULL DEFAULT GETDATE());
    END

    /* something here */

END

以下是我用来创建证书并向过程添加签名的代码:-

CREATE CERTIFICATE [CodeSigningCertificate]
    ENCRYPTION BY PASSWORD = 'Query@St@ck'
    WITH EXPIRY_DATE = '2099-01-01'
        ,SUBJECT = 'DBA Code Signing Cert'
GO

CREATE LOGIN [CodeSigningLogin] FROM CERTIFICATE [CodeSigningCertificate];
GO
CREATE USER [CodeSigningLogin] FOR LOGIN [CodeSigningLogin];
GO
EXEC master..sp_addsrvrolemember @loginame = N'CodeSigningLogin', @rolename = N'sysadmin'
GO

GRANT EXECUTE ON dbo.sp_Kill TO [CodeSigningLogin];
GO
ADD SIGNATURE TO [dbo].[sp_Kill]
    BY CERTIFICATE [CodeSigningCertificate]
    WITH PASSWORD = 'Query@St@ck'
GO
GRANT EXECUTE ON OBJECT::dbo.sp_Kill TO [public]
GO

还是,不明白为什么会出现错误916-无法在当前安全上下文下访问。我尝试删除/创建程序。

0 个答案:

没有答案