Как предоставить разрешения для табличной функции

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.
Майк

Ответы:

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 / Windows, вероятно, безопаснее всего использовать скобки.
RDFozz
-4

Я пытался использовать:

GRANT SELECT ON functionName TO another_user

Но это не сработало, тогда я использовал EXECUTEвместо SELECT, и теперь работает

Ахмед Негм
источник
Мне любопытно, как вы справились с этим, поскольку попытка grant executeиспользования функции SQL всегда приводит к ошибке.
Ян Кемп
3
Вероятно, это была не табличная функция, поэтому она работала.
Диего