Bazen herhangi bir login’i sileceğim zaman aşağıdaki hatalar ile karşılaşmaktayım.

Hata mesajına göre, LOGIN1 adlı sunucu girişini (login) silemiyorsun çünkü bu kullanıcı başka kullanıcılara yetki vermiş. SQL Server’da bir login’i silebilmek için, o login tarafından verilmiş tüm yetkileri geri alman 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.

Sadece DB veritabanına bağlı DBLOGIN kullanıcısını silebildim. Aşağıdaki hata sonucu ilgili veritabanı üzerinde yetkiyi kaldırınca silinmiş oldu ilgili login.

Bu hataların çözüm yolları genellikle aynı login’in yetkili oldu veritabanı scheme role job veya başka bir işlem üzerinde yetkisi olduğu zaman ona yönelmeliyiz.
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
Aşağıdaki komut ile active transaction varsa kullanıcıya ait şu script ile bulabiliriz. Active monitör ekranındanda bakabiliriz.
SELECT session_id
FROM sys.dm_exec_sessions
WHERE login_name = 'LOGIN1'

Herhangi bir veritabanı altında login’i silinmiş user’ı silmek istediğimde yukarıdaki hata ile karşılaştım. Kullanıcının herhangi bir yetkisinin olduğunu söylüyor.
Bunun için veritabanı altında kullanıcının role’ler üzerinde yetkisi varmış onlara bakalım. Hataya odaklanırsak database role olduğunu belirtiyor. İlgili role’deki LOGIN1’i değiştiriyorum.

Değiştirdikten sonra silme işlemi başarılı bir şekilde olmuş oldu.

Başta bu ifadeyi çalıştırdığımda herhangi bir sonuç dönmemişti. Yukarıdaki resim ise herhangi bir ifade dönmemiş hali.

USE TEST;
select *
from sys.database_permissions
where grantor_principal_id = user_id ('LOGIN1');

İlgili veritabanı altında permissions bölümünden tüm login’lerin yetkileri alındıktan ve LOGIN1 kullanıcısının yetkileri alındıktan sonra silme işlemi yapılabilir.


Yukarıdaki gibi bir user’ı silersek karşılaşılan hata ile nasıl bir yola izlemeliyiz. Kullanıcının database üzerinde herhangi bir scheme üzerinde yetkili olduğunu söylüyor.

Yukarıdaki herhangi bir script alıp daha sonra bunu db_owner ve farklı bir kullanıcı yaparak silebiliriz.
USE [CONTAIDDB]
GO
ALTER AUTHORIZATION ON SCHEMA::[db_owner] TO [dbo]
GO

B user’ı silmeye çalıştığımda aynı hatayı almış oldum yukarıdaki işlemin aynısını yaparak B user’ı silebilirim.

Başka bir makalede görüşmek dileğiyle..
“Onlara, “Gökleri ve yeri kim yarattı?” diye soracak olsan, mutlaka “Allah” diyeceklerdir. De ki: “Bütün övgüler Allah’a mahsustur”; ama onların çoğu bilmez.”Lokman-25