«Service Broker» - директор сервера «SA» не может получить доступ к базе данных в соответствии с текущим контекстом безопасности
-
21-12-2019 - |
Вопрос
Я работаю с SQL Server 2012 Express.
Я использую Service Broker для запуска сохраненной процедуры асинхронно.
Процедура активации должна получить доступ к другой базе данных для выполнения другой сохраненной процедуры.Это код:
CREATE PROCEDURE [dbo].[GetNewCodes]
@gintNewCodes bigint,
@presNewCodes tinyint,
@levelNewCodes bigint,
@quantityNewCodes smallint
AS
-- Get new codes from INCIC database.
DECLARE @return_value int,
@xmlGenerated xml,
@xmlString NVARCHAR(MAX)
SET NOCOUNT ON;
-- Set that this stored procedure is running
update dbo.RunningSPs with (serializable) set conf_value = 1
where sp_name = N'GetNewCodes'
if @@rowcount = 0
begin
insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 1)
end
EXEC @return_value = [INCIC].[dbo].[ReadCodeBuffer]
@gint = @gintNewCodes,
@pres = @presNewCodes,
@level = @levelNewCodes,
@quantity = @quantityNewCodes,
@xmlGenerated = @xmlGenerated OUTPUT
SET @xmlString = cast(@xmlGenerated as nvarchar(max))
-- Process these new codes on TRZ.
EXEC dbo.ProcessCodes @XmlString = @xmlString
-- Update that we are not running this procedure any more.
update dbo.RunningSPs with (serializable) set conf_value = 0
where sp_name = N'GetNewCodes'
if @@rowcount = 0
begin
insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 0)
end
.
Проблема здесь: [INCIC].[dbo].[ReadCodeBuffer]
, а сообщение об ошибке:
Ошибка: 50000
Необрабавленная ошибка в процедуре GetNewCodes: 916: принцип сервера «SA» не может получить доступ к базе данных «Incic» в соответствии с текущим контекстом безопасности.
Я последовал за этим Учебное пособие для реализации службы, очереди иАктивация хранимой процедуры.
Как я могу исправить эту проблему?
Решение
Читайте Звоните процедуру в другомБаза данных из активированной процедуры .
Проблема заключается в том, что активированные процедуры выполняются под выполнением в качестве пользовательского контекста, и, как таковые подлежат ограничениям приличных базы данных (они являются песочниками в базе данных).Все объясняется в Расширение разрешения базы данных с помощью Execute AS .
Решение состоит в том, чтобы подписать свою активированную процедуру и создать пользователь, полученный из сертификата подписания в целевой базе данных, и предоставить этот полученный пользователь необходимые разрешения.Первая ссылка показывает полный пример.
Другие советы
Ответ Ремус Русану явно окончательно и правильно.(Любой, кто занимается брокером, знает его опыт и бесценный блог.)
Я просто хотел документировать мой опыт, так как Google будет направляться на этот вопрос при поиске « Chanenter Server» SA "не может получить доступ к базе данных ... "
В моем случае я называл еще одну базу данных из активированной процедуры, но вызывающую оператор SQL напрямую, а не сохраненную процедуру.
ПервоначальноВызов кросс-базы данных работал нормально без подписанного сертификата и использования олицетворения.Затем после небольшого изменения синтаксиса он начал возвращать вышеуказанное сообщение об ошибке.
Вот что работает без необходимости подписанного сертификата:
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyOtherDb')
.
А вот что спровоцировало исключение безопасности:
IF DB_ID(N'MyOtherDb') IS NOT NULL
.