วิธีการให้สิทธิ์ในฟังก์ชันที่มีค่าเป็นตาราง


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 แทนที่จะเป็น GRANT EXECUTE
Mike

คำตอบ:


33

ฟังก์ชันสเกลาร์ต้องการEXECUTEสิทธิ์ แต่เมื่อคุณแปลงเป็นฟังก์ชันที่มีค่าในตารางสิทธิ์ที่จำเป็นต้องเปลี่ยนจะSELECTเป็น

ตอนนี้คุณต้อง GRANT SELECT ON functionName TO another_user;

จากBOL :

ผู้ใช้อื่นที่ไม่ใช่เจ้าของจะต้องได้รับอนุญาต EXECUTE สิทธิ์ในฟังก์ชั่น (ถ้าฟังก์ชันนั้นมีค่าสเกลาร์) ก่อนที่พวกเขาจะสามารถใช้ได้ในคำสั่ง Transact-SQL หากฟังก์ชั่นเป็นค่าตารางผู้ใช้จะต้องมีสิทธิ์ SELECT ในฟังก์ชั่นก่อนที่จะอ้างอิง


และตามความคิดเห็นของ RDFozz ต่อคำตอบอื่นถ้าชื่อผู้ใช้มีอักขระพิเศษ (เช่นแบ็กสแลชเช่นใน DOMAINNAME \ ชื่อผู้ใช้) คุณต้องใส่ชื่อผู้ใช้ในวงเล็บเหลี่ยม, viz:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme

0

มันจะต้องมีGRANT SELECT ON functionName TO [another_user]- ด้วยวงเล็บ


วงเล็บเป็นทางเลือกยกเว้นว่าชื่อผู้ใช้มีอักขระพิเศษ เนื่องจากแบ็กสแลชเป็นอักขระพิเศษและมักจะเป็นส่วนหนึ่งของชื่อผู้ใช้สำหรับการเข้าสู่ระบบการรับรองความถูกต้องของผู้ใช้ที่มี Windows การเข้าสู่ระบบการพิสูจน์ตัวตนมันอาจจะปลอดภัยที่สุดในการใช้วงเล็บ
RDFozz

-4

ฉันพยายามใช้:

GRANT SELECT ON functionName TO another_user

แต่มันใช้งานไม่ได้แล้วฉันใช้EXECUTEแทนSELECTและตอนนี้ใช้งานได้


ฉันอยากรู้ว่าคุณจัดการสิ่งนี้อย่างไรการพยายามgrant executeใช้ฟังก์ชัน SQL จะทำให้เกิดข้อผิดพลาดเสมอ
Ian Kemp

3
มันอาจไม่ใช่ฟังก์ชันที่มีค่าเป็นตาราง
Diego
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.