Як надати дозволи на функцію на основі таблиці


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 Наданий або відкликаний привілей ВИКОНАННЯ не сумісний з об'єктом.

Ця функція використовується так:

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 \ ім'я користувача), тоді потрібно поставити ім'я користувача у квадратні дужки, а саме: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
Це, мабуть, не була табличною функцією, тому вона працювала.
Дієго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.