Cara memberikan izin pada fungsi bernilai tabel

21

Apakah saya melakukannya dengan benar ...?

Saya memiliki fungsi yang mengembalikan uang ...

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

Saya hanya ingin tahu apakah ini mungkin untuk dikonversi ke iTVF?

Saya sudah mencoba melakukan ini tetapi saya mendapat kesalahan:

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

KESALAHAN:

Msg 4606, Level 16, State 1, Line 2 Hak istimewa yang diberikan atau dicabut EXECUTE tidak kompatibel dengan objek.

Fungsi ini digunakan seperti ini:

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

Terima kasih sebelumnya!

Jack Frost
sumber
Karena Anda sekarang mengembalikan tabel, pernyataan GRANT harus GRANT SELECT, bukan GRANT EXECUTE.
Mike

Jawaban:

33

Fungsi skalar memerlukan EXECUTEizin, namun saat Anda mengonversi ke Fungsi Bernilai Tabel, izin yang diperlukan berubah SELECT.

Kamu harus sekarang GRANT SELECT ON functionName TO another_user;

Dari BOL :

Pengguna selain pemilik harus diberikan izin EXECUTE pada suatu fungsi (jika fungsinya bernilai skalar) sebelum mereka dapat menggunakannya dalam pernyataan Transact-SQL. Jika fungsi bernilai tabel, pengguna harus memiliki izin SELECT pada fungsi sebelum merujuknya.

Mark Sinkinson
sumber
Dan per komentar RDFozz pada jawaban lain, jika nama pengguna memiliki karakter khusus (seperti garis miring terbalik, seperti dalam DOMAINNAME \ nama pengguna) maka Anda harus memasukkan nama pengguna dalam tanda kurung kotak, yaitu:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

Perlu GRANT SELECT ON functionName TO [another_user]- dengan kurung.

jason
sumber
Tanda kurung adalah opsional kecuali nama pengguna menyertakan karakter khusus. Karena backslash adalah karakter khusus, dan sering akan menjadi bagian dari nama pengguna untuk pengguna dengan login otentikasi Windows, mungkin paling aman untuk terbiasa menggunakan tanda kurung.
RDFozz
-4

Saya mencoba menggunakan:

GRANT SELECT ON functionName TO another_user

Tapi itu tidak bekerja, maka, saya menggunakan EXECUTEbukannya SELECT, dan bekerja sekarang

Ahmed Negm
sumber
Saya ingin tahu bagaimana Anda mengatur ini, karena mencoba grant executefungsi SQL akan selalu menimbulkan kesalahan.
Ian Kemp
3
Itu mungkin bukan fungsi bernilai tabel, itu sebabnya itu bekerja.
Diego