SQL Server’da WITHOUT LOGIN, bir veritabanı kullanıcısının (database user) herhangi bir sunucu oturumu (login) olmadan oluşturulmasını sağlar. Kısaca Sql user without login login olmadan veritabanı seviyesinde oluşturulan logindir. Application rollerin yerine gelmiştir.
WITHOUT LOGIN’ın Amacı
– Bağımsız Kullanıcılar (Orphaned Users) oluşturmak için kullanılır.
– Bu tür kullanıcılar sadece belirli bir veritabanında çalışır ve sunucu seviyesinde bir kimlik doğrulama gerektirmez.
– Güvenliği artırmak için, SQL Server’a doğrudan bağlanabilen login hesapları yerine sadece veritabanı erişimi gerektiren kullanıcılar oluşturulabilir.
Özellik | Normal SQL Login(SQL user with login) | SQL user without login |
Sunucu Seviyesinde Yetki | Evet | Hayır |
Bağlantı ile SQL Server’a Giriş | Evet | Hayır |
Belirli Veritabanı İçinde Çalışabilir mi? | Evet | Evet |
Veritabanı Dışındaki Kaynaklara Erişim | Evet | Hayır |
Hangi veri tabanı üzerinde user açılmak isteniyorsa o veri tabanı seçilir. Database>Security>Users>New User seçilir

Genellikle login ve şifre bilgileri uygulama içerisinde connection string’e yazılır ve tüm uygulamacılar aynı kullanıcı adı ve şifreyi kullanır. Bir uygulamacı işten ayrıldığında bu yüzden şifrenin değiştirilip connection string’de de değiştirilmesi gerekir. SQL User Without Login ile login olmadan bir user oluşturuyoruz ve bu user’a gerekli yetkileri veriyoruz. Daha sonra uygulama veritabanına bağlanmak isteyen uygulamacılara bu user üzerinden impersonate etme hakkı(yani bu login’miş gibi davranma hakkı) veriyoruz. Uygulamacılarda bu user’ı kullanarak veritabanında gerekli işlemlerini yapabiliyorlar.
İlk başta bir login oluşturdum ve bu login’e TEST veritabanı üzerinde yetki verdim.
USE[master]
GO
CREATE LOGIN [LOGIN1] WITH PASSWORD=N'1', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [TEST]
GO
CREATE USER [LOGIN1] FOR LOGIN [LOGIN1]
GO
Sonra ilgili veritabanı altında TAKLIT adında SQL user without login user oluşturduk birden fazlada oluşturabiliriz. Bu user’ı oluştururken veritabanı altında db _owner yetkisi veriyoruz.



USE TEST
EXECUTE AS USER = 'TAKLIT'
SELECT*FROM CSVORNEK
REVERT
Yukarıdaki komutu çalıştırdığımda böyle bir login olmadığını veya impersonate hakkı vermediğimiz için böyle bir login olmadığını ve hata verdiğini söylüyor.
Cannot execute as the server principal because the principal “TAKLIT” does not exist, this type of principal cannot be impersonated, or you do not have permission.

Oluşturduğumuz bu user’a daha önceden oluşturduğumuz login’i impersonate etme hakkı veriyoruz. Burada impersonate edilen kullanıcının başka haklar verilmesine gerek yoktur.

USE [TEST]
GO
GRANT IMPERSONATE ON USER::[TAKLIT] TO [LOGIN1]
GO
Yukarıdaki kod bloğunu arayüzden de yapabiliriz.
USE TEST
EXECUTE AS USER = 'TAKLIT'
SELECT*FROM CSVORNEK
REVERT

Burada TAKLIT user’ı LOGIN1 üzerinden veritabanı bağlantısını gerçekleştirdikten sonra TAKLIT user’ın yetkilerini kullanarak ve üzerinde tanımlanmış olan izinleri kullanabilir. Burada dikkat edersek LOGIN1 kullanıcısı sadece TEST veritabanına bağlanma yetkisi vardı.(public)
Kısacası birden fazla login oluşturacağımıza veritabanı altında user oluşturarak login’i taklit etmesini sağlayabiliriz. User’ların login şifresini bilmelerinin önüne geçmiş oluruz.
WITHOUT LOGIN Ne Zaman Kullanılır?
– Bağımsız Uygulama Rollerinde: Bir uygulama veritabanına erişirken, sunucu genelinde bir oturum açma gereksinimi olmadan yalnızca ilgili veritabanında yetkilendirilmiş kullanıcılar kullanılabilir.
– Güvenlik Amaçlı: Sunucu seviyesinde login oluşturmak istemediğiniz durumlarda, yalnızca belirli bir veritabanında erişim sağlamak için kullanılır.
– Database Containment (Kapsamlı Veritabanları): Eğer bir veritabanı “contained database” olarak yapılandırılmışsa, bu kullanıcılar sadece ilgili veritabanında çalışabilir.
Başka bir makalede görüşmek dileğiyle..
“Her kim kendini iyiliğe adamış olarak özünü Allah’a teslim ederse sağlam kulpa yapışmış demektir. İşlerin sonu Allah’a varır.”Lokman-22