Подписание модуля - сообщение 916, участник сервера не может получить доступ к базе данных в текущем контексте безопасности - PullRequest
1 голос
/ 16 мая 2019

Я использую концепцию подписи модулей и пытаюсь выполнить подписанную сертификатом хранимую процедуру [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 - Невозможно получить доступ в текущем контексте безопасности. Я попытался удалить / создать процедуру.

...