Comprobar si existe un usuario en una base de datos de SQL Server

28

Estoy trabajando con SQL Server 2012. Quiero verificar si existe un usuario antes de agregarlo a una base de datos.

Esto es lo que he probado:

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

Pero, este código SELECT name FROM [sys].[server_principals]no regresa si ese usuario existe en MyDatabase.

¿Cómo puedo verificar si existe un usuario en MyDatabase?

VansFannel
fuente
1
Tenga en cuenta que sys.database_principals contiene roles y usuarios juntos, por lo que no se debe olvidar filtrar a los usuarios. Estoy actualizando la consulta final con la respuesta actualmente marcada para una referencia fácil.
Moiz Tankiwala

Respuestas:

26

Usar en sys.database_principalslugar de sys.server_principals.

Entonces la consulta final se vería así (teniendo en cuenta el filtro de usuario):

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
fuente
2
Una forma rápida de obtener esto (u otra comprobación de existencia de objetos) es hacer clic derecho en un objeto de base de datos y seleccionar "DROP AND CREATE TO", que generará la cláusula adecuada SI NO EXISTE.
LowlyDBA
15

Yo uso SUSER_ID () y USER_ID () para este tipo de cosas:

-- 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
fuente
44
Según la recomendación de Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID se eliminará en un futuro próximo y la función recomendada para usar en su lugar es DATABASE_PRINCIPAL_ID [ docs.microsoft.com / es-es / sql / t-sql / functions /…
Moiz Tankiwala
El enlace está roto. Nuevo enlace: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Refinamiento adicional ya que esto haría una lectura más óptima

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
fuente
0

Si está utilizando servidores registrados, puede verificar muchos servidores a la vez y devolver un verdadero / falso con:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
Sir jura mucho
fuente
Es posible que desee actualizar su respuesta para mencionarla en database_principalslugar de server_principals, consulte la pregunta, se trata de usuarios a nivel de base de datos .
Max Vernon