Jak przyznać uprawnienia dla funkcji wycenianej w tabeli

21

Czy robię to dobrze...?

Mam funkcję, która zwraca pieniądze ...

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

Zastanawiam się tylko, czy można to przekonwertować na iTVF?

Próbowałem to zrobić, ale wystąpił błąd:

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

BŁĄD:

Msg 4606, poziom 16, stan 1, wiersz 2 Przyznane lub cofnięte uprawnienie EXECUTE nie jest zgodne z obiektem.

Ta funkcja jest używana w następujący sposób:

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

Z góry dziękuję!

Dziadek Mróz
źródło
Ponieważ zwracasz teraz tabelę, instrukcja GRANT musi być GRANT SELECT, a nie GRANT EXECUTE.
Mike

Odpowiedzi:

33

Funkcje skalarne wymagają EXECUTEuprawnień, jednak po przekonwertowaniu na funkcję wycenioną w tabeli wymagane uprawnienia zmieniają się na SELECT.

Musisz teraz GRANT SELECT ON functionName TO another_user;

Z BOL :

Użytkownicy inni niż właściciel muszą uzyskać uprawnienie EXECUTE do funkcji (jeśli funkcja ma wartość skalarną), zanim będą mogli jej używać w instrukcji Transact-SQL. Jeśli funkcja jest wyceniana w tabeli, użytkownik musi mieć uprawnienia SELECT do funkcji przed odwołaniem się do niej.

Mark Sinkinson
źródło
I według komentarza RDFozz do innej odpowiedzi, jeśli nazwa użytkownika ma znaki specjalne (jak ukośnik odwrotny, jak w DOMAINNAME \ nazwa użytkownika), to musisz umieścić nazwę użytkownika w nawiasach kwadratowych, a mianowicie:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

Musi być GRANT SELECT ON functionName TO [another_user]- za pomocą nawiasów.

Jason
źródło
Nawiasy są opcjonalne, chyba że nazwa użytkownika zawiera znak specjalny. Ponieważ ukośnik odwrotny jest znakiem specjalnym i często będzie częścią nazwy użytkownika dla użytkowników z logowaniem do uwierzytelniania systemu Windows, prawdopodobnie najbezpieczniej jest nawiązywać do nawiasów.
RDFozz
-4

Próbowałem użyć:

GRANT SELECT ON functionName TO another_user

Ale to nie zadziałało, więc użyłem EXECUTEzamiast tego SELECTi działa teraz

Ahmed Negm
źródło
Jestem ciekawy, jak sobie z tym poradziłeś, ponieważ próba grant executeużycia funkcji SQL zawsze spowoduje zgłoszenie błędu.
Ian Kemp,
3
Prawdopodobnie nie była to funkcja ceniona w tabeli, dlatego działała.
Diego