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ę!


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.


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.