Verwaiste SQL-Logins auf einem SQL-Server ermitteln
Auf einem SQL-Server kann es vorkommen, dass es Logins gibt, zu denen es gar keine User-Zuordnung mehr in Datenbanken gibt. Das kann mehrere Ursachen haben. Erste Ursache kann sein, dass dem Login einfach der Zugriff auf eine Datenbank entzogen wurde. Zweite Ursache kann sein, dass die Datenbanken auf die der Nutzer mal Zugriff hatte, nun vom Server gelöscht wurden - entweder weil sie obsolet waren oder weil sie nun auf einem anderen Server liegen. Diese verwaisten Logins dümpeln nun noch auf dem Server herum (Security -> Logins).
Nun kann es ganz interessant und auch wichtig sein, herauszufinden, wie es um den Server in Bezug auf dieses Thema bestellt ist, um ggf. Aufräumaktionen zu starten. Besonders bei vielen Logins oder bei vielen Datenbanken kann es dann aber schon zeitaufwändig werden, bei jedem Login in die User-Mappings zu schauen und dort zu prüfen, ob eine Datenbank angehakt ist.
Für SQL-Logins kann das folgende Skript schnell eine Übersicht generieren:
CREATE TABLE #OrphanedLogins (sid varbinary(85) NOT NULL)
-- get all sql logins except of sa
INSERT INTO #OrphanedLogins (sid)
SELECT sid FROM sys.server_principals WHERE type = 'S' AND sid <> 0x01
-- iterate trough all databases and determine if one of the logins exists there
-- delete found sids from temp table
exec sp_msforeachdb 'DELETE #OrphanedLogins
FROM sys.database_principals dp INNER JOIN #OrphanedLogins ol
ON dp.sid = ol.sid'
-- get the result
SELECT * FROM sys.server_principals sp
INNER JOIN #OrphanedLogins ol ON
sp.sid = ol.sid
Die Lösung für NT-Nutzer sieht so ähnlich aus. Aber Achtung: Logins können auch sysadmin-Funktionen haben und dann kann es gerechtfertigt sein, dass diese keine Datenbankzuordnung haben. Aus diesem Grund sollte anhand des Ergebnisses nicht blind gelöscht werden.