Vérifier si un utilisateur existe dans une base de données SQL Server

28

Je travaille avec SQL Server 2012. Je souhaite vérifier si un utilisateur existe avant de l'ajouter à une base de données.

Voici ce que j'ai testé:

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT name 
                FROM [sys].[server_principals]
                WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO

Mais, ce code SELECT name FROM [sys].[server_principals]ne revient pas si cet utilisateur existe dans MyDatabase.

Comment puis-je vérifier si un utilisateur existe dans MyDatabase?

VansFannel
la source
1
Gardez à l'esprit que sys.database_principals contient des rôles et des utilisateurs ensemble, il ne faut donc pas oublier de filtrer les utilisateurs. Je mets à jour la requête finale par rapport à la réponse actuellement marquée pour une référence facile.
Moiz Tankiwala

Réponses:

26

Utilisez sys.database_principalsau lieu de sys.server_principals.

Ainsi, la requête finale ressemblerait à ceci (en tenant compte du filtre utilisateur):

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT [name]
                FROM [sys].[database_principals]
                WHERE [type] = N'S' AND [name] = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Chris Aldrich
la source
2
Un moyen rapide d'obtenir ceci (ou une autre vérification de l'existence d'un objet) consiste à cliquer avec le bouton droit sur un objet de base de données et à sélectionner "DROP And CREATE TO" qui générera la clause IF NOT EXISTS appropriée.
LowlyDBA
15

J'utilise SUSER_ID () et USER_ID () pour ce genre de choses:

-- Check SQL Server Login
IF SUSER_ID('SomeLogin') IS NULL
    CREATE LOGIN SomeLogin WITH PASSWORD = 'SomePassword';

-- Check database user
IF USER_ID('SomeUser') IS NULL
    CREATE USER SomeUser FOR LOGIN SomeLogin;
spaghettidba
la source
4
Conformément à la recommandation de Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID sera progressivement supprimé et la fonction recommandée à utiliser à la place est DATABASE_PRINCIPAL_ID [ docs.microsoft.com / fr-fr / sql / t-sql / fonctions /…
Moiz Tankiwala
Le lien est rompu. Nouveau lien: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Un raffinement supplémentaire, car cela rendrait la lecture plus optimale.

USE [MyDatabase]
GO

IF DATABASE_PRINCIPAL_ID('IIS APPPOOL\MyWebApi AppPool') IS NULL
BEGIN
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
END
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Moiz Tankiwala
la source
0

Si vous utilisez des serveurs résistants, vous pouvez vérifier plusieurs serveurs à la fois et renvoyer un vrai / faux avec:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
Sir jure beaucoup
la source
Vous voudrez peut-être mettre à jour votre réponse pour mentionner database_principalsau lieu de server_principals- vérifiez la question - il s'agit des utilisateurs au niveau de la base de données .
Max Vernon