SQL Server’daki Tüm Kullanıcı Tablolarında Yetkileri Verme Kılavuzu

SQL Server’da yetkilerin yönetimi, veritabanınızın bütünlüğünü ve güvenliğini korumak için kritik öneme sahiptir. Sıklıkla ortaya çıkan bir senaryo, tüm kullanıcı tablolarına belirli bir veritabanı rolüne sorunsuz bir şekilde yetki vermeniz gerektiğinde gerçekleşir. Yeni tablolar eklediğinizde birden fazla script yazmaktan ya da yetkileri manuel olarak ayarlamaktan dolayı bunaldıysanız, yalnız değilsiniz. Bu kılavuzda, kullanıcı tablolarında SELECT, REFERENCES, INSERT, UPDATE ve DELETE yetkilerini veritabanı rolüne kolaylıkla verebilmeniz için çok yönlü bir SQL scripti oluşturmayı inceleyeceğiz.

Zorluk: Yetkileri Verme İşlemini Verimli Hale Getirme

SQL Server Management Studio (SSMS), genellikle bireysel veritabanı nesneleri için scriptler üretir; bu da birden fazla tablo ile çalışırken can sıkıcı olabilir. Ayrıca, yeni eklenen tablolar için yetkilerin değiştirilmesi hızlı bir şekilde zaman alıcı bir iş haline gelebilir. İhtiyacınız olan şey, kullanıcı tablolarının tamamında yetkileri uygulamak için her seferinde script’e geri dönmeyi gerektirmeyen sağlam bir “ateşle ve unut” scriptidir.

Çözüm: Yetki Vermek İçin Bir Saklı Prosedür

Yetki verme işlemini etkili bir şekilde otomatikleştirmek için, tüm kullanıcı nesneleri arasında döngü oluşturmak için bir cursor kullanan bir saklı prosedür oluşturabiliriz. Süreci yönetilebilir adımlara ayıralım:

Adım 1: Saklı Prosedürü Oluşturma

Saklı prosedürünüzü tanımlayarak başlayın. Aşağıdaki SQL kodunu şablon olarak kullanabilirsiniz:

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

Adım 2: Bileşenleri Anlama

  • Cursor Tanımı: c_objects cursor’u, tüm kullanıcı tabloları (U), görünümler (V) ve saklı prosedürler (P) arasında döngü oluşturacak şekilde ayarlanmıştır.
  • Yetki Uygulaması: Cursor aracılığıyla elde edilen her nesne için sistem, tanımlı hakları belirtilen role uygulamak amacıyla bir GRANT komutu çalıştırır.
  • Çıktı Bilgisi: Prosedür, yürütme zamanını ve hangi nesnelere yetki verildiğini gösteren günlükler yazdırır.

Adım 3: Prosedürü Çalıştırma

Saklı prosedür oluşturulduktan sonra, onu basit bir komut ile çalıştırabilirsiniz:

EXEC sp_grantastic

Sadece bu komut ile veritabanı rolünüz, tüm kullanıcı tablolarında gerekli yetkileri sorunsuz bir şekilde alacaktır.

Sonuç

Tüm kullanıcı tablolarında bir veritabanı rolüne yetki veren güçlü bir SQL scripti nasıl oluşturacağınızı öğrendiniz. Bu yaklaşım, iş akışınızı kolaylaştırmakla kalmaz, aynı zamanda yetkilerinizin her zaman güncel olmasını da sağlar ve manuel müdahaleye ihtiyaç duymaz. Bir sonraki sefer veritabanınıza yeni bir tablo eklediğinizde, saklı prosedürü tekrar çalıştırmak yeterlidir ve işiniz hallolmuş olur.

İyi kodlamalar!