«Service Broker» - директор сервера «SA» не может получить доступ к базе данных в соответствии с текущим контекстом безопасности

StackOverflow https://stackoverflow.com//questions/23008315

Вопрос

Я работаю с 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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top