web-dev-qa-db-fra.com

Supprimer les utilisateurs SQL orphelins

J'ai un serveur Microsoft SQL qui avait une base de données appelée sqldatabase. Il a également eu un utilisateur appelé SQLUser. La sqldatabase a été supprimée mais pas SQLUser. SQLuser appartenait uniquement à Sqldatabase. Je veux connaître tous les utilisateurs "cassés" (E.G. SQLUSER) qui ne fait pas partie d'une base de données SQL afin que je puisse "nettoyer la maison". Je peux aller dans chaque utilisateur SQL et les supprimer en cherchant à voir s'ils sont attachés, mais cela semble très inefficace et quelque chose qu'un script puisse vous aider. C'est ce que je demande.

Le serveur dispose de 200 bases de données SQL mais 250 utilisateurs SQL. Je souhaite supprimer les 50 utilisateurs de 50 SQL supplémentaires car ils ne sont pas utilisés et il n'y a aucune raison de les avoir.

J'essaie de trouver un script pour me permettre de trouver (et de supprimer) ces utilisateurs SQL ou au moins identifier, donc je n'ai pas besoin d'accéder à chacun des utilisateurs SQL individuellement.

1
NTBuddy

Il semble y avoir une certaine confusion sur la terminologie. Un utilisateur existe au niveau de la base de données et est supprimé lorsque vous déposez une base de données. Une connexion existe au niveau du serveur et est mappée sur un utilisateur de la base de données pour accéder à la base de données.

Je suppose que vous voulez trouver toutes les connexions qui ne sont pas mappées sur un utilisateur de la base de données et ne sont donc plus utilisées. La requête ci-dessous atteindra cela:

CREATE TABLE ##UnusedLogins (
    [Login] NVARCHAR(255),
    [InUse] BIT
)

INSERT INTO ##UnusedLogins ([Login], [InUse])
SELECT [login].[name] AS [Login],
    0 AS [InUse]
FROM sys.server_principals [login]
WHERE [login].[name] NOT LIKE 'NT SERVICE\%'
    AND [login].[name] NOT LIKE 'NT AUTHORITY\%'
    AND [login].[name] NOT LIKE '##%'
    AND [login].[type_desc] <> 'SERVER_ROLE'
    AND [login].[name] <> 'sa'

EXEC sp_msforeachdb 'UPDATE ul
SET [InUse] = 1
FROM ##UnusedLogins ul
INNER JOIN sys.server_principals [login] ON [login].[name] = ul.[Login]
INNER JOIN [?].sys.database_principals [user] ON [user].[sid] = [login].[sid]'

SELECT * FROM ##UnusedLogins

DROP TABLE ##UnusedLogins

Toute connexion dans la sortie qui a une 1 dans la colonne INUIRE est mappée sur un utilisateur de la base de données. Tout login avec un 0 n'est pas mappé. Cela ne signifie pas que la connexion n'est pas utilisée, simplement qu'elle n'est pas mappée à un utilisateur de la base de données.

3
HandyD