Я использую концепцию подписи модулей и пытаюсь выполнить подписанную сертификатом хранимую процедуру [master].[dbo].[sp_kill]
. Я могу проверить, что proc подписан, используя [sys].[crypt_properties]
. Логин, созданный из сертификата, имеет [sysadmin]
роль сервера. Разрешение EXECUTE предоставляется всем пользователям, использующим запрос ниже: -
GRANT EXECUTE ON sp_Kill TO [public]
Тем не менее, при попытке выполнить процедуру с использованием логина SQL с низкими привилегиями, имеющего права доступа CONNECT
& VIEW ANY DATABASE
, я получаю сообщение об ошибке
Сообщение 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 - Невозможно получить доступ в текущем контексте безопасности. Я попытался удалить / создать процедуру.