2011-07-17 11 views
36

¿Hay alguna forma de que pueda saber si el usuario (no el inicio de sesión) ya está creado en la base de datos? Me refiero al usuario, no al inicio de sesión, ya que sé cómo verificar el inicio de sesión. Necesito verificar para el usuario que se crea dentro de un DB específico & un rol asignado a él.¿Cómo comprobar si el USUARIO ya está creado en la base de datos o no en SQL?

Este es el código para la comprobación de la entrada:

SELECT name FROM sys.server_principals WHERE name = 'test_user' 

pero ¿y el usuario? Ya que necesito crear el usuario y asignarle un rol si no se crea. De lo contrario, continuaré sin crear.

Gracias

Respuesta

60

¿Qué tal:

USE (your database you want to check the user's existence in) 

SELECT * 
FROM sys.database_principals 
WHERE name = '(your user name to check here)' 

sys.server_principals muestra los inicios de sesión definidas en el nivel de servidor - sys.database_principals que muestra los principales (por ejemplo, cuentas de usuario) a nivel de base de datos.

+0

@marc_s: Supuse que el usuario en CREATE USER puede no coincidir con el inicio de sesión en CREATE LOGIN. por ejemplo 'CREAR MARCAS DE USUARIO FROM LOGIN gbn' – gbn

3

Si has encontrado sys.server_principals, me sorprende que no se haya encontrado sys.database_principals. Puede unir las vistas basadas en la columna sid.

14

Esto le dirá el nombre de usuario coincidente para un nombre de inicio de sesión dada

USE MyDB 
SELECT 
    sp.name AS ServerLoginName, 
    dp.name AS DBUserName 
FROM 
    sys.server_principals sp 
    LEFT JOIN 
    sys.database_principals dp ON sp.sid = dp.sid 
WHERE 
    sp.name = 'MyLogin' 
+0

Gracias" gbn "... funciona;) – Q8Y

+0

Esta es la respuesta más correcta. El inicio de sesión de SQL se puede asignar a un usuario de base de datos con un nombre diferente. – themilkyninja

+0

@themilkyninja, Puede que tenga que aplicar ambos cheques (uno y el de marc_s). Si vas a crear un usuario con un nombre específico, entonces debes verificar que el nombre de usuario esté disponible (ejecutando la marca marc_s). Además, debido al enlace de 1 a 1 entre el inicio de sesión y el usuario, debe verificar que ningún usuario esté asociado con el inicio de sesión (ejecutando la verificación de gbn). –

7
use SomeDatabase 
go 

/* built-in system function */ 
select database_principal_id('UserNameHere') 

/* check if exists and drop */ 
if database_principal_id('UserNameHere') is not null 
    drop user 'UserNameHere' 
go 
+0

Bienvenido a Stackoverflow. ¿Puede explicar su respuesta para futuros usuarios para comprender mejor su respuesta? – Sim

0

Es posible que cuidar de este método, así ...

IF DATABASE_PRINCIPAL_ID('domain\lanid') IS NULL 
BEGIN 
    CREATE USER [domain\lanid] FOR LOGIN [domain\lanid] WITH DEFAULT_SCHEMA=[dbo] 
    EXEC sp_addrolemember N'db_ApplicationUserRole', N'domain\lanid' 
END 
Cuestiones relacionadas