Cách cấp quyền trên hàm có giá trị bảng


21

Tôi làm đúng không...?

Tôi có một chức năng trả lại tiền ...

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

Tôi chỉ tự hỏi nếu điều này là có thể được chuyển đổi sang iTVF?

Tôi đã thử làm điều này nhưng tôi đã gặp một lỗi:

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

LỖI:

Msg 4606, Cấp 16, Trạng thái 1, Dòng 2 Cấp đặc quyền được cấp hoặc thu hồi EXECUTE không tương thích với đối tượng.

Hàm này được sử dụng như thế này:

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

Cảm ơn trước!


Vì bạn hiện đang trả về một bảng, câu lệnh GRANT cần phải là GRANT CHỌN, thay vì GRANT EXECUTE.
Mike

Câu trả lời:


33

Các hàm vô hướng yêu cầu EXECUTEquyền, tuy nhiên khi bạn đã chuyển đổi thành Hàm có giá trị bảng, các quyền được yêu cầu thay đổi thành SELECT.

Bây giờ bạn phải GRANT SELECT ON functionName TO another_user;

Từ BOL :

Người dùng không phải là chủ sở hữu phải được cấp quyền EXECUTE cho một hàm (nếu hàm này có giá trị vô hướng) trước khi họ có thể sử dụng nó trong câu lệnh Transact-SQL. Nếu hàm có giá trị bảng, người dùng phải có quyền CHỌN trên hàm trước khi tham chiếu nó.


Và theo nhận xét của RDFozz về một câu trả lời khác, nếu tên người dùng có các ký tự đặc biệt (như dấu gạch chéo ngược, như trong DOMAINNAME \ tên người dùng) thì bạn cần đặt tên người dùng trong ngoặc vuông, viz:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme

0

Nó cần phải GRANT SELECT ON functionName TO [another_user] - với dấu ngoặc.


Dấu ngoặc là tùy chọn trừ khi tên người dùng bao gồm một ký tự đặc biệt. Vì dấu gạch chéo ngược là một ký tự đặc biệt và thường là một phần của tên người dùng cho người dùng đăng nhập xác thực Windows, nên có lẽ an toàn nhất là theo thói quen sử dụng dấu ngoặc.
RDFozz

-4

Tôi đã cố gắng sử dụng:

GRANT SELECT ON functionName TO another_user

Nhưng nó không hoạt động, sau đó, tôi đã sử dụng EXECUTEthay thế SELECTvà bây giờ nó hoạt động


Tôi tò mò về cách bạn quản lý điều này, vì cố gắng grant executetrên một hàm SQL sẽ luôn gây ra lỗi.
Ian Kemp

3
Nó có thể không phải là một hàm có giá trị bảng, đó là lý do tại sao nó hoạt động.
Diego
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.