如何授予对表值函数的权限


21

我做对了吗...?

我有一个可以退款的功能...

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

我只是想知道是否可以将其转换为iTVF?

我尝试这样做,但出现错误:

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

错误:

消息4606,级别16,状态1,第2行授予或撤销的特权EXECUTE与对象不兼容。

该函数的用法如下:

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

提前致谢!


当您现在返回表时,GRANT语句需要是GRANT SELECT,而不是GRANT EXECUTE。
迈克

Answers:


33

标量函数需要EXECUTE权限,但是当您转换为表值函数时,所需权限将变为SELECT

你现在必须 GRANT SELECT ON functionName TO another_user;

BOL

除所有者以外的其他用户必须先被授予对函数的EXECUTE权限(如果该函数是标量值),然后才能在Transact-SQL语句中使用它。如果该函数是表值的,则用户在引用该函数之前必须对该函数具有SELECT权限。


根据RDFozz对另一个答案的评论,如果用户名包含特殊字符(例如反斜杠,例如DOMAINNAME \ username),则需要将用户名放在方括号中,即:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme

0

它必须是GRANT SELECT ON functionName TO [another_user]-带括号。


除非用户名包含特殊字符,否则括号是可选的。由于反斜杠是一个特殊字符,对于使用Windows身份验证登录的用户,反斜杠通常会成为用户名的一部分,因此,使用方括号的习惯可能最安全。
RDFozz '18年

-4

我尝试使用:

GRANT SELECT ON functionName TO another_user

但这没有用,于是,我用EXECUTE代替SELECT,现在可以用了


我对您如何管理此方法感到好奇,因为尝试grant execute使用SQL函数始终会引发错误。
伊恩·肯普

3
它可能不是表值函数,这就是它起作用的原因。
迭戈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.