我正在使用模块签名概念,并尝试执行证书签名的存储过程[master].[dbo].[sp_kill]
。我可以使用[sys].[crypt_properties]
验证proc是否已签名。从证书创建的登录名具有[sysadmin]
服务器角色。使用以下查询向所有用户授予EXECUTE权限:-
GRANT EXECUTE ON sp_Kill TO [public]
仍然,当尝试使用具有CONNECT
和VIEW 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-无法在当前安全上下文下访问。我尝试删除/创建程序。