Gewähren von Berechtigungen für eine Tabellenwertfunktion

21

Mache ich das richtig...?

Ich habe eine Funktion, die Geld zurückgibt ...

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

Ich frage mich nur, ob dies möglich ist, auf iTVF konvertiert zu werden.

Ich habe versucht, dies zu tun, aber ich habe einen Fehler erhalten:

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

ERROR:

Meldung 4606, Ebene 16, Status 1, Zeile 2 Erteilte oder widerrufene Berechtigung AUSFÜHREN ist nicht mit Objekt kompatibel.

Diese Funktion wird folgendermaßen verwendet:

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

Danke im Voraus!

Jack Frost
quelle
Da Sie jetzt eine Tabelle zurückgeben, muss die GRANT-Anweisung GRANT SELECT und nicht GRANT EXECUTE sein.
Mike

Antworten:

33

Für skalare Funktionen sind EXECUTEBerechtigungen erforderlich. Wenn Sie jedoch in eine Tabellenwertfunktion konvertiert haben, ändern sich die erforderlichen Berechtigungen in SELECT.

Du musst jetzt GRANT SELECT ON functionName TO another_user;

Von BOL :

Anderen Benutzern als dem Eigentümer muss die EXECUTE-Berechtigung für eine Funktion erteilt werden (wenn die Funktion skalarwertig ist), bevor sie sie in einer Transact-SQL-Anweisung verwenden können. Wenn die Funktion einen Tabellenwert hat, muss der Benutzer über SELECT-Berechtigungen für die Funktion verfügen, bevor er auf sie verweist.

Mark Sinkinson
quelle
Und gemäß dem Kommentar von RDFozz zu einer anderen Antwort müssen Sie den Benutzernamen in eckige Klammern setzen, wenn der Benutzername Sonderzeichen enthält (z. B. einen umgekehrten Schrägstrich wie in DOMAINNAME \ username), und zwar:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

Es muss sein GRANT SELECT ON functionName TO [another_user]- mit Klammern.

Jason
quelle
Die Klammern sind optional, sofern der Benutzername kein Sonderzeichen enthält. Da Backslash ein Sonderzeichen ist und häufig Teil des Benutzernamens für Benutzer mit Windows-Authentifizierungsanmeldungen ist, ist es wahrscheinlich am sichersten, die Klammern zu verwenden.
RDFozz
-4

Ich habe versucht zu benutzen:

GRANT SELECT ON functionName TO another_user

Aber es hat damals nicht funktioniert, ich habe es EXECUTEstattdessen verwendet SELECT, und es funktioniert jetzt

Ahmed Negm
quelle
Ich bin gespannt, wie Sie dies geschafft haben, da der Versuch, grant executeeine SQL-Funktion auszuführen, immer einen Fehler auslöst.
Ian Kemp
3
Es war wahrscheinlich keine Tabellenfunktion, deshalb hat es funktioniert.
Diego