Come concedere le autorizzazioni per una funzione con valori di tabella


21

Lo sto facendo bene ...?

Ho una funzione che restituisce denaro ...

CREATE FUNCTION functionName( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  RETURNS money AS BEGIN

  DECLARE @v_dint money   set @v_dint = computation_here
     set @v_dint = round(@v_dint, 2)

  RETURN @v_dint    
END 
GO 
Grant execute on functionName to another_user 
Go

Mi chiedo solo se è possibile convertirlo in iTVF?

Ho provato a farlo ma ho riscontrato un errore:

CREATE FUNCTION functionName ( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  
RETURNS TABLE AS 
RETURN SELECT returnMoney = computation_here  
GO  
Grant execute on functionName to another_user  Go

ERRORE:

Messaggio 4606, livello 16, stato 1, riga 2 Privilegio concesso o revocato EXECUTE non è compatibile con l'oggetto.

Questa funzione viene utilizzata in questo modo:

update table_name set interest = functionName(col1,col2...) where...

Grazie in anticipo!


Dato che ora stai restituendo una tabella, l'istruzione GRANT deve essere GRANT SELECT, anziché GRANT EXECUTE.
Mike,

Risposte:


33

Le funzioni scalari richiedono EXECUTEautorizzazioni, tuttavia quando si è convertite in una funzione con valori di tabella le autorizzazioni richieste cambiano in SELECT.

Devi adesso GRANT SELECT ON functionName TO another_user;

Da BOL :

Gli utenti diversi dal proprietario devono disporre dell'autorizzazione EXECUTE su una funzione (se la funzione ha un valore scalare) prima di poterla utilizzare in un'istruzione Transact-SQL. Se la funzione è valutata a livello di tabella, l'utente deve disporre delle autorizzazioni SELECT per la funzione prima di fare riferimento a essa.


E per il commento di RDFozz su un'altra risposta, se il nome utente ha caratteri speciali (come una barra rovesciata, come in DOMAINNAME \ nomeutente), è necessario inserire il nome utente tra parentesi quadre, vale a dire:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme

0

Deve essere GRANT SELECT ON functionName TO [another_user]- con parentesi.


Le parentesi sono opzionali a meno che il nome utente non includa un carattere speciale. Poiché la barra rovesciata è un carattere speciale e spesso farà parte del nome utente per gli utenti con accessi di autenticazione di Windows, è probabilmente più sicuro avere l'abitudine di utilizzare le parentesi.
RDFozz,

-4

Ho provato ad usare:

GRANT SELECT ON functionName TO another_user

Ma non ha funzionato, quindi, l'ho usato al EXECUTEposto di SELECT, e funziona ora


Sono curioso di sapere come ci sei riuscito, poiché tentare di eseguire grant executeuna funzione SQL genererà sempre un errore.
Ian Kemp,

3
Probabilmente non era una funzione valutata a livello di tabella, ecco perché ha funzionato.
Diego
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.