31 Ocak 2013 Perşembe

SQL Server İpuçları - 1: Server Login & Database User

Bu yazımda değinmek istediğim konu, SQL Server terimlerine yabancı olan birçok arkadaşın "kullanıcı" genel başlığı altında birbirine sıkça karıştırdığı Server Login ve Database User arasındaki fark. Bunun sıklıkla karıştırıldığını görüyorum. Eğer örneklerle anlatacak olursak, ki bunun birçok durumda oldukça iyi sonuçlar verdiğini görüyorum, Server Login'ini bir apartmanın giriş kapısının anahtarı olarak düşünebilirsiniz. Database User'ını da bir dairenin anahtarı gibi. Bir apartmanın (SQL Server Instance'ı) genelde bir tane ana giriş kapısı ve dolayısıyla bir tane apartman anahtarı (Server Login) olur, bu apartmanda birden çok daire (veritabanı) olduğunu varsayabiliriz ve bunların da anahtarları (Database Users) ve apartmana Server Login'iniz ile girdikten sonra, girebileceğiniz dairelere de Database User'larınızla girersiniz.

Server Login (bundan böyle artık sadece Login diyeceğim)'i ile Database User (artık sadece User diyeceğim)'ı aynı isimde de olabilir, farklı isimlerde de olabilir. Örneğin benim Login'imin adı "eonsoy" olsun diyelim. Eğer "Firmalarim" isimli veritabanında bu Login'e (örneğin SELECT yetkisi) yetki vermek istersem, öncelikle "Firmalarim" veritabanında bu Login için bir User oluşturmam ve bu User ile Login'i birbirine bağlamam gerekir. SELECT yetkisini de User'a, User'ı oluşturduktan sonra verebilirim. Bir Login'in, birçok veritabanında kendisine bağlı User'ları olabilir. Buna "mapping" deniyor. Security Identifier (SID) ile User(lar), Login'lerine "map ediliyor", yani bağlanıyor. Bir veritabanındaki bir User, sadece bir Login'e bağlanabilir; bir Login birden fazla veritabanındaki User'a bağlanabilir. Yani apartman giriş kapısının anahtarı olan birisi, o apartmandaki birçok dairenin anahtarına sahip olabilir.

Sunucu (yani SQL Server Instance'ı) seviyesindeki yetkiler Login'e verilir (örn: Trace açma yetkisi), veritabanı düzeyindeki yetkiler de (örn: Select, Update, Delete gibi) Database User'lara verilir.

Not-1: "sysadmin" yetkisine sahip bir Login'in ise User'lara ihtiyacı yoktur, her veritabanında her istediğini yapabilir. Yukarıdaki örnekten, bu arkadaşın güzel bir maymuncuğu olduğunu düşünebilirsiniz.

Not-2: SQL Server 2012 ile birlikte yeni bir özellik olan Contained Databases özelliği geldi. Bu özellikte, yukarıda anlattığım mantığa alternatif bir yöntem de geldi. O yüzden Contained Database User'larını gördüğünüzde kafa karışıklığı olmasın diye not düşmek istedim. Bunlardan da başka bir yazıda bahsederim. Bununla birlikte yukarıdaki anlattığım mantık SQL Server 2012'de de mevcut, bir yere gittiği yok.

2 yorum:

Unknown dedi ki...

Öncelikle yazınız harika olmuş, ellerinize sağlık. Yazınızdan tam olarak login ve user i anladım.
Benim şöyle bir sorum ve sorunum var. Uzak sunucudaki bir 2008 express servere tcpIp ile bağlanıyorum. Bir proje için, şöyle bir gereksinime ihtiyaç duydum. Bir kullanıcının , belirlenen veri tabanı ve belirlenen tablo dışında işlem yapamasını engellemek istiyorum.

Oncelikle baglantı001 adında bir login oluşturuyorum. Server Role=public. Daha sonra işlem yapılacak veritabanında bir user oluşturuyorum deneme001 ve login name'den baglantı001 'i seçip, datawriter yetkisi verip kaydediyorum.(management studio ile)

1) baglantı001 login ile studio ile bağlanabiliyorum ama login olarak ilişkilendirdiğim halde deneme001 ile bağlanamıyorum.
2) baglantı001 ile baglandığımda, tüm veritabanları üzerinde işlem yapabiliyorum, oysa tek bir veritabanına ilişkilendirdiğim halde
3)Yapmak istediğim şey, bir login oluşturmak ve bu loginle sadece belirliğim veritabanına ulaşmak, bu logine bağlayacağım userlerle de bir tablo üzerinde sadece insert yetkisi vermek...

Cevabınız ya da öneri linkiniz için teşekkür ederim..

Ekrem Önsoy dedi ki...

Selam,

Kusura bakma, biraz geç gördüm yorumunu. Temel olarak yapman gereken bir Login oluşturmak. Erişim yapmak istediğin bir veritabanı için, bu Login'e bir User oluşturmak ve bu User'a da belirlediğin tablo için INSERT yetkisi vermek. Kod şöyle bir şey:


USE [master]
GO
CREATE LOGIN [ekremo] WITH PASSWORD=N'1', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [Veritabani_adi]
GO
CREATE USER [ekremo] FOR LOGIN [ekremo]
GO
use [Veritabani_adi]
GO
GRANT INSERT ON [dbo].[Tablo_adi] TO [ekremo]
GO