"Service Broker" Il server principale "SA" non è in grado di accedere al database sotto il contesto di sicurezza corrente

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

Domanda

Sto lavorando con SQL Server 2012 Express.

Sto usando il broker di servizio per eseguire una procedura memorizzata in modo asincrono.

La procedura di attivazione deve accedere a un altro database per eseguire un'altra procedura memorizzata.Questo è il codice:

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
.

Il problema è qui: [INCIC].[dbo].[ReadCodeBuffer] e il messaggio di errore è:

.

Errore: 50000
Errore irreversibile in procedura GetNewcodes: 916: il principale principale "SA" non è in grado di accedere al database "incicale" nell'ambito del contesto di sicurezza corrente.

Ho seguito questo tutorial per implementare il servizio, la coda eProcedura memorizzata di attivazione.

Come posso risolvere questo problema?

È stato utile?

Soluzione

Leggi chiama una procedura in un altrodatabase da una procedura attivata .

Il problema è che le procedure attivate vengono eseguite in un esecuzione come contesto utente e in quanto tale sono soggetti a restrizioni di impersonazione del database (sono sandboxed all'interno del database).È tutto spiegato in estendendo l'impersonazione del database utilizzando l'esecuzione come .

La soluzione è quella di firmare la procedura attivata e creare un utente derivato dal certificato di firma nel database di destinazione e concedere a questo utente derivato le autorizzazioni richieste.Il primo link mostra un esempio completo.

Altri suggerimenti

La risposta di Remus Rusanu è chiaramente definitiva e corretta.(Qualcuno che ha a che fare con Broker Services conosce la sua esperienza e il blog inestimabile.)

Volevo solo documentare la mia esperienza, poiché Google indirizzerà a questa domanda durante la ricerca su " il server del server" SA "non è in grado di accedere al database ... "

Nel mio caso, ho chiamato un altro database da una procedura attivata, ma invocando direttamente un'istruzione SQL, non una procedura memorizzata.

Originariamente, la chiamata del database cross-database ha funzionato bene senza un certificato firmato e l'uso di impersonazione.Quindi, dopo una piccola modifica della sintassi, ha iniziato a restituire il messaggio di errore sopra.

Ecco cosa ha funzionato senza la necessità di un certificato firmato:

IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'MyOtherDb')
.

Ed ecco ciò che ha provocato l'eccezione di sicurezza:

IF DB_ID(N'MyOtherDb') IS NOT NULL
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top