การดำเนินการได้รับอนุญาตถูกปฏิเสธบนวัตถุ 'xxxxxxx', ฐานข้อมูล 'zzzzzzz', schema 'dbo'


187

ฉันมีปัญหาในการใช้งานฟังก์ชั่น

นี่คือสิ่งที่ฉันทำ:

  1. สร้างฟังก์ชั่นโดยใช้ SQL Server Management Studio สร้างสำเร็จแล้ว
  2. จากนั้นฉันพยายามเรียกใช้ฟังก์ชันที่สร้างขึ้นใหม่และนี่คือสิ่งที่ฉันได้รับ:

สิทธิ์ดำเนินการถูกปฏิเสธบนวัตถุ 'xxxxxxx', ฐานข้อมูล 'zzzzzzz', schema 'dbo'


หากมีบทบาท db_owner ผู้ใช้สามารถดำเนินการได้ (ไม่เท่ากับให้สิทธิ์ exec ... )
hazjack

ฉันได้รับข้อผิดพลาดนี้เมื่อมีข้อผิดพลาดทางไวยากรณ์ในคำสั่ง SQL ของฉัน เป็นหลักฉันได้รวมGOและเข้าCreate GOCreateข้อผิดพลาดทางไวยากรณ์อื่น ๆ ก็ดูเหมือนจะให้ข้อผิดพลาดนี้
Ganesh Kamath - 'Code Frenzy'

คำตอบ:


163

ดูเหมือนว่าคุณจะต้องให้สิทธิ์ดำเนินการแก่ผู้ใช้ (หรือกลุ่มที่พวกเขาเป็นส่วนหนึ่ง) สำหรับกระบวนการจัดเก็บที่เป็นปัญหา

ตัวอย่างเช่นคุณสามารถให้สิทธิ์การเข้าถึงดังนี้:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
สวัสดีฉันรู้ว่ามันเป็นเวลาที่ผ่านมา แต่ฉันมีคำถาม การกระทำดังกล่าวอาจมีปัญหาด้านความปลอดภัยหรือไม่ มีการเปิด sp เพื่อใช้สำหรับทุกคนหรือไม่
Valentyn Vynogradskiy

9
ใช่มันอนุญาตให้ทุกคนที่มีการเชื่อมต่อกับฐานข้อมูลสามารถเรียกใช้กระบวนงานที่เก็บไว้ได้ ฉันจะคาดหวังว่าคนกังวลเกี่ยวกับความปลอดภัยในการเข้าถึงทุนกับกลุ่มที่เกี่ยวข้องในของพวกเขาฐานข้อมูล
Rowland Shaw

7
คุณยังสามารถใช้GRANT EXEC TO PUBLICเพื่อให้สิทธิ์การเข้าถึงวัตถุทั้งหมดในฐานข้อมูล
sohaiby

2
ฉันจะไม่ให้สิทธิ์ผู้อนุญาตแก่บทบาทสาธารณะ ไม่ว่าด้วยวิธีใดก็ตามในสภาพแวดล้อมของเรามันได้รับคำสั่งว่าบทบาทสาธารณะถูกปิดใช้งาน ฉันให้สิทธิ์ดำเนินการแก่ผู้ใช้ที่ระบุหรือบทบาทที่สร้างไว้อย่างชัดเจนสำหรับวัตถุประสงค์นี้
user1161391

4
เหตุใดทุกคนที่ออกความเห็นเกี่ยวกับการเสนอแนะให้สิทธิสาธารณะในการดำเนินการทุกอย่างในฐานข้อมูล นั่นเป็นกรณีพิเศษไม่ใช่ defacto
Sat Thiru

111

ทางออกที่ดีที่สุดที่ฉันพบคือสร้างบทบาทฐานข้อมูลใหม่

CREATE ROLE db_executor;

จากนั้นให้สิทธิ์บทบาทผู้บริหาร

GRANT EXECUTE TO db_executor;

ตอนนี้เมื่อคุณไปที่คุณสมบัติของผู้ใช้และไปที่การแมปผู้ใช้และเลือกฐานข้อมูลที่คุณได้เพิ่มบทบาทใหม่ตอนนี้บทบาทใหม่จะปรากฏในการเป็นสมาชิกบทบาทของฐานข้อมูลสำหรับ: ส่วน

สำหรับรายละเอียดเพิ่มเติมอ่านบทความเต็ม


8
คำตอบนี้ดีที่สุดถ้าคุณต้องการให้ EXECUTE สำหรับ SP ทั้งหมดในการเข้าสู่ระบบของผู้ใช้โดยเฉพาะ - โดยไม่ต้องใช้ public หรือ db_owner ดูเหมือนว่าคำตอบที่ชาญฉลาดและมีประโยชน์ที่สุดที่นี่
jcollum

1
ด้วยเหตุผลบางอย่างนี่เป็นคำตอบเดียวที่ใช้ได้กับฉันใน SQL Server 2012 การให้สิทธิ EXECUTE ของผู้ใช้ของฉันกับผู้ใช้ของฉันไม่ชัดเจน ใช้งานได้เฉพาะเมื่อสืบทอดการอนุญาตผ่านบทบาท
Keith

1
นี่ควรเป็นคำตอบ มันใช้งานได้อย่างมีเสน่ห์สำหรับฉัน ขอบคุณมาก!
Shahbaaz

จากนั้นเพิ่มไปยังบัญชีเช่นEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan

72

ใน Studio จัดการเซิร์ฟเวอร์ SQL:

เพียงแค่ไปที่ security->schema->dboเพียงแค่ไปที่

คลิกสองครั้งที่ dbo จากนั้นคลิกpermission tab->(blue font)view database permissionและเลื่อนเพื่อดูฟิลด์ที่ต้องการเช่น"execute".ช่วยเหลือตัวเองเพื่อเลือกใช้grantหรือdenyควบคุม หวังว่านี่จะช่วยได้ :)



45

สิ่งนี้จะใช้งานได้หากคุณพยายามให้สิทธิ์แก่ผู้ใช้หรือบทบาท

การใช้ Microsoft SQL Server Management Studio:

  1. ไปที่: ฐานข้อมูล
  2. คลิกขวาที่ dbo.my_database
  3. เลือก: คุณสมบัติ
  4. บนแผงด้านซ้ายคลิกที่: สิทธิ์
  5. เลือกผู้ใช้หรือบทบาทและในแผงชื่อ
  6. ค้นหาดำเนินการในสิทธิ์และเครื่องหมายถูก: อนุญาตด้วยอนุญาตหรือปฏิเสธ

น่าเสียดายที่ผู้ใช้มีสิทธิ์ดำเนินการอยู่แล้ว! ซึ่งเป็นเหตุผลที่เป็นเช่นนี้ทำให้เกิดความสับสน ....
ดักลาส Gaskell

ขอบคุณ Keim สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบเมื่อฉันทำเครื่องหมายให้
Rosh

16

การให้สิทธิ์ดังกล่าวอาจเป็นอันตรายโดยเฉพาะหากแอปพลิเคชันเว็บของคุณใช้ชื่อผู้ใช้เดียวกัน

ขณะนี้ผู้ใช้เว็บ (และทั้งเว็บทั่วโลก) ได้รับอนุญาตให้สร้างและวางวัตถุในฐานข้อมูลของคุณ คิดว่า SQL Injection!

ฉันขอแนะนำให้ให้สิทธิ์ Execute แก่ผู้ใช้เฉพาะบนวัตถุที่กำหนดดังนี้:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

ตอนนี้ผู้ใช้ myusernameNoquotes สามารถเรียกใช้โพรซีเดอร์ที่เก็บไว้ ProcedureNameNoquotes โดยไม่ต้องมีการอนุญาตที่ไม่จำเป็นอื่น ๆ กับข้อมูลอันมีค่าของคุณ



3

หากคุณมีปัญหาเช่นคำถามที่ถามไว้ข้างต้นเกี่ยวกับข้อยกเว้นที่เกิดขึ้นเมื่อดำเนินการแก้ไขปัญหาคือสิทธิ์ไม่ได้รับอนุญาตอย่างถูกต้องให้กับผู้ใช้ของกลุ่มนั้นเพื่อเข้าถึงฐานข้อมูล / ขั้นตอนการจัดเก็บ สิ่งที่คุณต้องทำคือทำสิ่งที่ฉันมีด้านล่างแทนที่ฉันด้วยชื่อฐานข้อมูลของคุณขั้นตอนการจัดเก็บ (ฟังก์ชั่น) และประเภทของการอนุญาตหรือบทบาทหรือผู้ที่คุณอนุญาตให้เข้าถึง

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** วัตถุ: StoredProcedure [dbo]. [GetAllEmployees] วันที่สคริปต์: 01/27/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

คุณสามารถให้สิทธิ์ดำเนินการแก่ทุกคน:

GRANT Execute on [dbo].your_object to [public]

"สาธารณะ" เป็นบทบาทฐานข้อมูลเริ่มต้นที่ผู้ใช้ทั้งหมดเป็นสมาชิก


1

ฉันประสบปัญหาเดียวกันและฉันแก้ไขให้สิทธิ์ db_owner กับผู้ใช้ฐานข้อมูลด้วย


11
ฉันไม่คิดว่านี่เป็นทางออกที่ดี ... เพราะฉันไม่สามารถให้สิทธิ์การใช้งานเว็บแอปพลิเคชันของฉันแก่ฉัน .. ฉันไม่รู้ว่าใครโหวตให้โหวต
Mina Gabriel

7
ไม่แนะนำเนื่องจากไม่ปลอดภัยมาก คุณควรสร้างบทบาทที่เหมาะสมแทนการใช้ db_owner ซึ่งสามารถควบคุมฐานข้อมูลทั้งหมดได้อย่างสมบูรณ์
Yetiish

1

หากคุณทำให้ผู้ใช้นี้เป็นพิเศษสำหรับฐานข้อมูลเฉพาะบางทีคุณอาจไม่ได้ตั้งเป็น db_owner ใน "การแมปผู้ใช้" ของคุณสมบัติ


1

คุณควรที่จะปรับเปลี่ยนบทบาทเซิร์ฟเวอร์ซึ่งได้รับการออกแบบมาเพื่อให้ได้รับสิทธิ์ด้านความปลอดภัย เพิ่มบทบาทเซิร์ฟเวอร์ดูแลระบบให้กับผู้ใช้ของคุณ เพื่อความปลอดภัยที่ดีขึ้นคุณอาจมีบทบาทเซิร์ฟเวอร์ที่กำหนดเองของคุณ แต่วิธีนี้จะให้สิ่งที่คุณต้องการในตอนนี้

  1. Object Explorer -> เซิร์ฟเวอร์ -> ความปลอดภัย -> การเข้าสู่ระบบ
  2. คลิกขวาที่ผู้ใช้ที่คุณต้องการ
  3. ไปที่บทบาทเซิร์ฟเวอร์ทางซ้ายมือ
  4. ตรวจสอบให้แน่ใจว่ามีการตรวจดูแลระบบ
  5. กดตกลงและรีสตาร์ทเซิร์ฟเวอร์ SQL ของคุณ

โชคดี

ป้อนคำอธิบายรูปภาพที่นี่


1
ดูแลระบบคือ overkill ทั้งหมด (และอันตราย)
Trubs

0

นี่คือวิธีการให้สิทธิ์สำหรับผู้ใช้รายหนึ่งที่ไม่เปิดเผยต่อสาธารณะ

คำค้นหาโดยตรง:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

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