คู่มือที่ดีที่สุดในการมอบสิทธิ์ในการเข้าถึงตารางผู้ใช้ทั้งหมดใน SQL Server

การจัดการสิทธิ์ใน SQL Server เป็นสิ่งสำคัญสำหรับการรักษาความสมบูรณ์และความปลอดภัยของฐานข้อมูลของคุณ หนึ่งในสถานการณ์ทั่วไปเกิดขึ้นเมื่อคุณต้องมอบสิทธิ์ในการเข้าถึงตารางผู้ใช้ทั้งหมดให้กับบทบาทฐานข้อมูลเฉพาะอย่างไม่มีสะดุด หากคุณรู้สึกหงุดหงิดกับการเขียนสคริปต์หลายชุดหรือปรับแต่งสิทธิ์ด้วยตนเองทุกครั้งที่คุณเพิ่มตารางใหม่ คุณไม่ได้อยู่คนเดียว ในคู่มือนี้ เราจะสำรวจวิธีการสร้างสคริปต์ SQL ที่มีความหลากหลายซึ่งช่วยให้คุณสามารถมอบสิทธิ์ SELECT, REFERENCES, INSERT, UPDATE, และ DELETE ให้กับบทบาทฐานข้อมูลบนตารางผู้ใช้ทั้งหมดได้อย่างง่ายดาย

ความท้าทาย: การมอบสิทธิ์อย่างมีประสิทธิภาพ

SQL Server Management Studio (SSMS) มักจะสร้างสคริปต์สำหรับวัตถุฐานข้อมูลแต่ละรายการ ซึ่งอาจจะน่าเบื่อเมื่อจัดการกับหลายตาราง นอกจากนี้ การปรับปรุงสิทธิ์สำหรับตารางที่เพิ่มใหม่สามารถกลายเป็นงานที่ใช้เวลาได้อย่างรวดเร็ว สิ่งที่คุณต้องการคือสคริปต์ “ยิงแล้วลืม” ที่สามารถดำเนินการได้เพื่อใช้สิทธิ์ทั่วทั้งตารางผู้ใช้ทั้งหมดโดยไม่ต้องกลับไปที่สคริปต์ทุกครั้ง

ทางออก: Stored Procedure สำหรับการมอบสิทธิ์

เพื่อให้สามารถมอบสิทธิ์ได้อย่างมีประสิทธิภาพ เราสามารถสร้าง stored procedure ที่ใช้ cursor เพื่อวนซ้ำผ่านวัตถุผู้ใช้ทั้งหมดและมอบสิทธิ์ที่ต้องการ มาลงรายละเอียดกระบวนการในขั้นตอนที่ง่ายดาย:

ขั้นตอนที่ 1: สร้าง Stored Procedure

เริ่มต้นโดยการนิยาม stored procedure ของคุณ ใช้รหัส SQL ดังต่อไปนี้เป็นเทมเพลต:

IF EXISTS (
    SELECT 1 FROM sysobjects
    WHERE name = 'sp_grantastic'
    AND type = 'P'
)
DROP PROCEDURE sp_grantastic
GO

CREATE PROCEDURE sp_grantastic
AS
DECLARE
 @object_name VARCHAR(30),
 @time VARCHAR(8),
 @rights VARCHAR(20),
 @role VARCHAR(20)

DECLARE c_objects CURSOR FOR
    SELECT name
    FROM sysobjects
    WHERE type IN ('P', 'U', 'V')
    FOR READ ONLY

BEGIN
    SELECT @rights = 'ALL',
           @role = 'PUBLIC'

    OPEN c_objects
    WHILE (1=1)
    BEGIN
        FETCH c_objects INTO @object_name
        IF @@SQLSTATUS <> 0 BREAK

        SELECT @time = CONVERT(VARCHAR, GetDate(), 108)
        PRINT '[%1!] hitting up object %2!', @time, @object_name
        EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)
    END

    PRINT '[%1!] fin!', @time

    CLOSE c_objects
    DEALLOCATE CURSOR c_objects
END
GO

GRANT ALL ON sp_grantastic TO PUBLIC
GO

ขั้นตอนที่ 2: เข้าใจส่วนต่าง ๆ

  • การประกาศ Cursor: Cursor c_objects ถูกตั้งขึ้นเพื่อวนซ้ำผ่านตารางผู้ใช้ทั้งหมด (U), มุมมอง (V), และ stored procedures (P).
  • การดำเนินการ Grants: สำหรับแต่ละวัตถุที่ดึงข้อมูลผ่าน cursor ระบบจะทำการสั่ง GRANT เพื่อใช้งานสิทธิ์ที่กำหนดกับบทบาทที่ระบุ
  • ข้อมูลผลลัพธ์: Procedure จะพิมพ์บันทึกที่บ่งบอกถึงเวลาของการดำเนินการและวัตถุใด ๆ ที่ได้รับสิทธิ์

ขั้นตอนที่ 3: ดำเนินการ Procedure

เมื่อได้สร้าง stored procedure เสร็จแล้ว คุณสามารถดำเนินการได้ด้วยคำสั่งง่าย ๆ:

EXEC sp_grantastic

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

สรุป

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

ขอให้การเขียนโค้ดเป็นไปอย่างราบรื่น!