Bu makalede veritabanında herhangi bir login silineceği zaman aşağıdaki hata mesajı alınmaktadır.

Server principal ‘LoginName’ has granted one or more permission(s). Revoke the permission(s) before dropping the server principal.
LOGIN1 adlı login, SQL Server üzerinde başka kullanıcılara veya nesnelere yetki vermiş durumda.
Bu yüzden SQL Server, bu login’i DROP (silme) işlemine izin vermiyor. Öncelikle bu izinlerin silinmesi gerekmektedir.
Yani:
- LOGIN1 başkalarına GRANT ile yetki vermiş
- Ya da bir server-level permission (örneğin ALTER ANY LOGIN, VIEW SERVER STATE vb.) vermiş
- Bu yetkiler geri alınmadan (REVOKE edilmeden) login silinemez
SQL Server’da bir login’i silebilmek için, o login tarafından verilmiş tüm yetkileri geri almamız gerekiyor.
Aşağıdaki komutla Öncelikle, LOGIN1 tarafından verilmiş yetkileri listelenir:
SELECT grantee_principal_id, permission_name, class_desc
FROM sys.server_permissions
WHERE grantor_principal_id = SUSER_ID('LOGIN1');
Çıktıda görülen her yetkiyi REVOKE komutu ile geri alman gerekiyor. Örneğin, IMPERSONATE yetkisi verdiyse şu komutla geri alabilirsin:

Aşağıdaki komutu çalıştırarak LOGIN1 tarafından verilmiş IMPERSONATE yetkisini kaldırılır:
REVOKE IMPERSONATE ON LOGIN::LOGIN1 FROM PUBLIC;
Eğer yetki belirli bir kullanıcıya verilmişse:
REVOKE IMPERSONATE ON LOGIN::LOGIN1 FROM KullaniciAdi;
--Başka yetkilerde varsa aşağıdaki komutlarda benzer şekilde kullanılır.
REVOKE CONNECT SQL TO LOGIN1;
REVOKE ALTER ANY LOGIN TO LOGIN1;
Kullanıcı yetkilendirmeleri alınmışsa aşağıdaki komut ile silinebilir.
DROP LOGIN LOGIN1;
Aşağıdaki komut ile veritabanı oluşturan login bilgileri verilmektedir. Bazen bu sebepten dolayıda login silme işlemi gerçekleşemez.
SELECT name, suser_sname(owner_sid) AS KULLANICI FROM sys.databases
Bu komutu çalıştırdıktan sonra LOGIN1 kullanıcısının hangi veritabanları üzerinde yetkili olduğunu görmüş oldum.

Veritabanları başta oluşturulurken owner’ı bu login seçilmiş.


Bu login’ler farklı bir login ile değiştirildikten sonra tekrardan loginimizin silme işlemini yapalım.

DROP LOGIN LOGIN1
Tekrardan aynı hatayı almış oldum. Aşağıdaki iki SQL sorgusu, SQL Server’da bir login’in (LOGIN1) başka kullanıcılara veya rollerine verdiği yetkileri ve yetki verilen kullanıcıları/rolleri tespit etmek için kullanılır.
SELECT class_desc,*
FROM sys.server_permissions
WHERE grantor_principal_id = (
SELECT principal_id
FROM sys.server_principals
WHERE NAME = N'LOGIN1')
SELECT NAME
,type_desc
FROM sys.server_principals
WHERE principal_id IN (
SELECT grantee_principal_id
FROM sys.server_permissions
WHERE grantor_principal_id = (
SELECT principal_id
FROM sys.server_principals
WHERE NAME = N'LOGIN1'))

Önceden oluşturmuş olduğum role’ü ilgili login üzerinden kaldırdıktan sonra login’imin başarılı bir şekilde silindiğini görmüş oluyorum.

Tüm jobların ownerlarını görmek için şu script’i kullanabilirsiniz. Herhangi bir job’da kullanıcı owner olduğu zamanda silinmeyebilir. Bunun için o job üzerinde o kullanıcının kaldırılması gerekmektedir.
SELECT s.name AS JobName, l.name AS JobOwner
FROM msdb..sysjobs s
LEFT JOIN master.sys.syslogins l ON s.owner_sid = l.sid
WHERE l.name IS NOT NULL
ORDER by l.name
Bu makalede herhangi bir sql login silerken karşılaşın hatayı dile getirdik. Başka bir makalede görüşmek dileğiyle..
“Dul ve fakirlere yardım eden kimse, Allah yolunda cihad eden veya gündüzleri (nafile) oruç tutup, gecelerini (nafile) ibadetle geçiren kimse gibidir.” (Buhârî,78)