สิทธิ์ EXECUTE ถูกปฏิเสธในประเภทตารางที่ผู้ใช้กำหนด?


88

ฉันมีคำถามเกี่ยวกับประเภทตารางที่ผู้ใช้กำหนดใน SQL Server 2008

สำหรับความต้องการของหนึ่งในแอปพลิเคชัน ASP.NET เราได้กำหนดชนิดตารางของเราเองบน SQL Server 2008 เพื่อใช้เป็นพารามิเตอร์ในโพรซีเดอร์ที่เก็บไว้ (เมื่อเรียกใช้คำสั่ง sql ในแอปพลิเคชัน ASP.NET เราจะส่งวัตถุ DataTable เป็นพารามิเตอร์สำหรับกระบวนงานที่เก็บไว้ดูตัวอย่างที่นี่ )

ปัญหาคือเมื่อเราเรียกใช้คำสั่ง Sql (ดำเนินการขั้นตอนที่เก็บไว้) จาก ASP.NET เราได้รับข้อผิดพลาด:

สิทธิ์ดำเนินการถูกปฏิเสธในวัตถุ 'ourTableType', ฐานข้อมูล 'ourDatabase', สคีมา 'ourSchema'

เหตุผลที่เป็นเช่นนั้น? เหตุใดเราจึงต้องกำหนดสิทธิ์ในประเภทตารางที่ผู้ใช้กำหนด เหตุใดจึงไม่เพียงพอที่จะตั้งค่าสิทธิ์ในกระบวนงานที่เก็บไว้ซึ่งใช้งานได้ และถ้าเราจะต้องตั้งมันไม่ว่าอะไรทำไมไม่มีEXECUTEประเภทสิทธิ์ในการตั้งค่าในหน้าต่างคุณสมบัติใด ๆ (ผมสามารถมองเห็นเพียงControl, References, Take Ownership, View Definition)?

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



ขอขอบคุณ! ฉันค้นหาแล้ว แต่ยังไม่ดีพอ: /
Janez

ลองใส่AS dboตอนท้าย เช่นนี้: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. ทำงานให้ฉัน
Jonathan

คำตอบ:


201

ฉันหวังว่าคุณจะแก้ปัญหานี้ได้ในตอนนี้เนื่องจากคำถามนี้มีอายุเกือบ 4 เดือนแล้ว แต่ในกรณีที่คุณยังทำไม่ได้นี่คือสิ่งที่ฉันคิดว่าเป็นคำตอบ

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

9
2 เซนต์ของฉัน: ขึ้นอยู่กับกลไกการตรวจสอบการเชื่อมต่อของคุณคุณอาจต้องให้สิทธิ์ผู้บริหารกับกลุ่มสาธารณะ ดังนั้นการให้สิทธิ์ของคุณจะมีลักษณะดังนี้ GRANT EXEC ON TYPE :: [schema] [typename] TO [Public] GO
Sudhanshu Mishra

@dotnetguy ขอบคุณมากไม่มีวิธีแก้ปัญหาใดที่เหมาะกับฉันนอกจากของคุณ
Mazen el Senih

3

หากโพรซีเดอร์ที่จัดเก็บของคุณใช้ dynamic sql หมายความว่า@sqlสร้างขึ้นแล้วเรียกใช้งานผ่านexec @sqlคุณจะต้องได้รับอนุญาตจากตารางพื้นฐาน

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

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
ขอบคุณสำหรับการชี้ให้เห็นสิ่งนี้ แต่กระบวนงานที่เก็บไว้ไม่มีไดนามิก sql อยู่ในนั้น เฉพาะINSERT INTOคำสั่งตารางทั่วไปและ´UPDATE´ ที่ผู้ใช้รายนี้มีสิทธิ์ทั้งหมดที่ต้องการ นอกจากนี้ผู้ใช้ / เข้าสู่ระบบนี้สงวน / สร้างขึ้นเป็นพิเศษสำหรับแอปพลิเคชัน ASP.NET นี้เพื่อให้สามารถเชื่อมต่อกับฐานข้อมูลนี้และดำเนินการตามขั้นตอนที่จัดเก็บไว้เท่านั้น (ไม่สร้าง ฯลฯ ผู้สร้างอยู่เสมอ'sa')
Janez

ขอบคุณนั่นคือปัญหาสำหรับฉัน ผู้อ่านรายอื่นที่มีปัญหานี้สามารถอ้างถึงสิทธิ์ของเซิร์ฟเวอร์ SQL บน Stored Procs ด้วยไดนามิก SQLสำหรับเคล็ดลับเพิ่มเติม
Nickolay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.