none
Chiamare una stored Procedure da un trigger tramite altro utente RRS feed

  • Domanda

  • Ciao a tutti,

    ho un problema di contesto, in un trigger tento di chiamare una sp che risiede sullo stesso server ma su un database diverso dal contesto ed è accessibile solo con un utente specifico (sempre diverso da quello del contesto). Il sql è 2008. Questo è il codice che tento di richiamare:

    SELECT

     

    * FROM OPENROWSET('SQLOLEDB','Server=sqltest,1433;UID=userlog;PWD=pwdtest;',exec DBLOG.dbo.spAppendToLog "prova",0,1001,"prova","1.1.1.1",6,6,"malfunzionamento generico",0')

    e questo è l'errore:

    Msg 7357, Level 16, State 2, Line 1

    Impossibile elaborare l'oggetto "exec DBLOG.dbo.spAppendToLog "prova",0,1001,"prova","1.1.1.1",6,6,"malfunzionamento generico",0". Il provider OLE DB "SQLNCLI10" per il server collegato "(null)" indica che l'oggetto non ha colonne o che l'utente corrente non dispone delle autorizzazioni necessarie.

     

    Qualcuno può aiutarmi a trovare anche un workaround?? Grazie in anticipo.

    Ciao Francesco 

    giovedì 15 luglio 2010 14:05

Risposte

  • Luca grazie mille dell'aiuto ,

    ho risolto lanciando il seguente comando sull'utente chiamante:

    GRANT IMPERSONATE ON login:: userlog TO userchiamante;

     

    Era necessario "dire" all'utente chiamante di poter "rappresentare" quello di destinazione.

     

    Ciao e grazie

    Francesco 

    lunedì 19 luglio 2010 14:00

Tutte le risposte

  • Ciao,
    prova a far precedere la chiamata alla tua Sp dalle impostazioni di set nocount on e set fmtonly off.

    Inoltre verifica se la SP che stai chiamando restituisce dei risultati alla OPENROWSET.

    SELECT

    * FROM OPENROWSET (

    'SQLOLEDB' , 'Server=sqltest,1433;UID=userlog;PWD=pwdtest;' ,set nocount on set fmtonly off exec DBLOG.dbo.spAppendToLog "prova",0,1001,"prova","1.1.1.1",6,6,"malfunzionamento generico",0 '

    )

    Una domanda:

    Ma se il trigger chiama una SP in un DB che è sulla stessa istanza SQL, perchè utilizzare la openrowset ?

    Non potresti chiamarla con NomeServer.dB.schema.SP e utilizzare l'EXECUTE AS ?

    Ciao !!

    Luca Ferrari

     

    venerdì 16 luglio 2010 15:15
  • Luca,grazie mille per la risposta,

    ho provato i settaggi set nocount on e set fmtonly off senza esito positivo, però in effetti la stored procedure che chiamo fa semplicemente una insert senza restituire risultati. Avevo già provato l'execute as ma il contesto rimane lo stesso, in pratica cambia utente ma sullo stesso db, io dovrei trovare un modo per eseguire lo "USE DB", ma dal trigger non è possibile. 

    Vi viene in mente qualche altra prova da fare??

    Ciao e grazie

    Francesco Clementi

    domenica 18 luglio 2010 21:11
  • Per completezza di informazioni riguardo le prove che ho fatto con l'execute, ho messo l'errore relativo:

     

    execute

     

    as user='userlog'

    exec

     

    DBLOG.dbo.spAppendToLog "prova",0,1001,"prova","1.1.1.1",6,6,"malfunzionamento generico",0

     

    Msg 916, Level 14, State 1, Line 2

    L'entità server "userlog" non è in grado di accedere al database "DBLOG" nel contesto di protezione corrente.

    Ciao e grazie ancora

    Francesco

    lunedì 19 luglio 2010 09:17
  • Creando un trigger come il seguente in teoria, se login ed user sono configurati correttamente non dovresti avere problemi ad eseguire l'istruzione in un contesto differente...

    create trigger dbo.test on dbo.testTable
    after insert,update
    AS
       
        declare @s as varchar(max)
        set @s = '[Database].[DBO].[miaStored_procedure] ''parametro'' '
        execute(@s) as Login = 'TuoUtente'

    go

    Scusa, non avevo visto la tua risposta...

    Ma userlog è uno user oppure un login ?

     

     

    Ciao

    Luca Ferrari

     

    lunedì 19 luglio 2010 09:52
  • uselog è un login associato al database DBLOG. Ovviamente tento di chiamarlo da un'altro database dove sono "loggato" con un'altro utente.

    Praticamente , se lancio il comando :

     

    execute as login='uselog' oppure execute as user='uselog'

    l'errore è:

    Msg 15406, Level 16, State 1, Line 1

    Impossibile eseguire come entità server perché l'entità "userlog" non esiste, questo tipo di entità non può essere rappresentato oppure non si dispone dell'autorizzazione.

     

    Provando il codice che hai riportato l'errore è sempre lo stesso:

    create trigger dbo.test on dbo.testTable
    after insert,update
    AS
       
        declare @s as varchar(max)
        set @s = '[Database].[DBO].[miaStored_procedure] ''parametro'' '
        execute(@s) as Login = 'TuoUtente'

    go

    Msg 15406, Level 16, State 1, Line 1

    Impossibile eseguire come entità server perché l'entità "userlog" non esiste, questo tipo di entità non può essere rappresentato oppure non si dispone dell'autorizzazione.

     

    Comincia a srgermi il dubbio che non si possa fare questa operazione all'interno di un trigger...............:(((

    Ciao

    Francesco

     

    lunedì 19 luglio 2010 10:25
  • L'errore a naso sembra relativo alle impostazioni degli utenti...

    Prova a dare un'occhio a questa Kb

    http://support.microsoft.com/?scid=kb%3Ben-us%3B913423&x=4&y=12

    Fammi sapere

    Ciao

    Luca

    lunedì 19 luglio 2010 10:30
  • Luca grazie mille dell'aiuto ,

    ho risolto lanciando il seguente comando sull'utente chiamante:

    GRANT IMPERSONATE ON login:: userlog TO userchiamante;

     

    Era necessario "dire" all'utente chiamante di poter "rappresentare" quello di destinazione.

     

    Ciao e grazie

    Francesco 

    lunedì 19 luglio 2010 14:00
  • Figurati !!

     

    Ciao

     

    Luca Ferrari

     

    lunedì 19 luglio 2010 15:32