ตัดทอนตารางการตั้งค่าการอนุญาตบนออบเจ็กต์เช่นกระบวนงานที่เก็บไว้สามารถทำได้ด้วย:
GRANT EXECUTE ON <schema>.<object> to <user>;
อย่างไรก็ตามคุณอาจต้องการให้สิทธิ์ด้านความปลอดภัยทั้งในระดับการเข้าสู่ระบบและผู้ใช้ คุณจะต้องกำหนดและให้สิทธิ์ที่จำเป็นสำหรับวัตถุที่ต้องมีการเข้าถึงเท่านั้น (เช่นการดำเนินการ) พิจารณาการใช้EXECUTE AS
ความสามารถในการปลอมตัวของผู้ใช้รายอื่นเพื่อตรวจสอบสิทธิ์ที่จำเป็นในการเรียกใช้โค้ดโดยไม่ต้องให้สิทธิ์ที่จำเป็นทั้งหมดแก่วัตถุต้นแบบทั้งหมด (เช่นตาราง) EXECUTE AS
สามารถเพิ่มไปยังขั้นตอนการจัดเก็บฟังก์ชั่นทริกเกอร์ ฯลฯ
เพิ่มรหัสดังต่อไปนี้ถูกต้องภายในขั้นตอนการจัดเก็บ:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
ในกรณีนี้คุณจะแอบอ้างเป็นเจ้าของโมดูลที่กำลังถูกเรียก นอกจากนี้คุณยังสามารถเลียนแบบ SELF หรือผู้ใช้ที่สร้างหรือแก้ไขโมดูล OR ... การเรียก CALLER ที่ไม่เหมาะสมซึ่งจะทำให้โมดูลสามารถรับสิทธิ์ของผู้ใช้ปัจจุบันหรือ ... เลียนแบบ OWNER ซึ่งจะต้องได้รับอนุญาตจาก เจ้าของโพรซีเดอร์ที่ถูกเรียกว่า OR ... เลียนแบบ 'user_name' ซึ่งจะปลอมตัวเป็นผู้ใช้เฉพาะหรือ OR ... เลียนแบบ 'login_name' ด้วยการปลอมตัวเป็นล็อกอินเฉพาะ
เวลาส่วนใหญ่คุณจะต้องให้EXECUTE
สิทธิ์แก่ procs ที่จัดเก็บไว้เท่านั้นและจากนั้นจะให้สิทธิ์กับวัตถุทั้งหมดที่อ้างอิงภายใน proc ที่เก็บไว้
ด้วยวิธีนี้คุณไม่จำเป็นต้องให้สิทธิ์โดยนัย (ตัวอย่าง: เพื่ออัปเดตข้อมูลหรือโทร procs เพิ่มเติม) การผูกมัดความเป็นเจ้าของจะจัดการสิ่งนี้ให้คุณ นี้จะเป็นประโยชน์อย่างยิ่งสำหรับ SQL CREATE TABLE
แบบไดนามิกหรือถ้าคุณจำเป็นต้องสร้างงานการรักษาความปลอดภัยสูงเช่น EXECUTE AS
เป็นเครื่องมือที่มีประโยชน์ในการพิจารณาสำหรับสิ่งเหล่านี้
ตัวอย่างนี้อาจช่วยชี้แจงทั้งหมดนี้:
สร้างผู้ใช้ชื่อ NoPrivUser ด้วยการเข้าถึงฐานข้อมูลสาธารณะ (เช่น dbadb):
USE [master];
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb],
CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO
USE [DBAdb];
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
หมายเหตุ: ผู้สร้างหรือเจ้าของกระบวนการนี้จะต้องสร้างสิทธิ์ในตารางภายในฐานข้อมูลเป้าหมาย
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
truncate table MyTable
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
-- Now log into your database server as NoPrivUser and run the following.
ด้วยส่วนEXECUTE AS
คำสั่งกระบวนงานที่เก็บไว้จะทำงานภายใต้บริบทของเจ้าของวัตถุ รหัสนี้สร้างสำเร็จdbo.MyTable
และแทรกแถวสำเร็จแล้ว ในตัวอย่างนี้ผู้ใช้NoPrivUser
ไม่มีสิทธิ์ที่ได้รับอนุญาตในการปรับเปลี่ยนตารางหรืออ่านหรือแก้ไขข้อมูลใด ๆ ในตารางนี้
จะใช้สิทธิ์ที่จำเป็นในการดำเนินงานเฉพาะนี้ให้เสร็จสิ้นภายในบริบทของกระบวนการนี้
วิธีการสร้างโพรซีเดอร์ที่เก็บไว้ซึ่งสามารถทำงานที่ต้องการสิทธิ์ความปลอดภัยที่ยกระดับโดยไม่ต้องกำหนดสิทธิ์เหล่านั้นอย่างถาวรจะมีประโยชน์มาก