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!