2012-05-13 21 views
23

La documentación de MSDN dice para SUSER_SNAME función:T-SQL: SUSER_SNAME frente a SUSER_NAME?

devuelve el nombre de inicio de sesión de identificación del número de identificación de seguridad de un usuario (SID).

Más encima, se dice para la función SUSER_NAME:

Devuelve el nombre de identificación de inicio de sesión del usuario.

Sin embargo, cuando yo haga las siguientes sentencias SQL consigo el mismo resultado:

SELECT SUSER_NAME(); 
SELECT SUSER_SNAME(); 

Así que, ¿cuáles son las diferencias, y que uno se usar? ¿Hay una situación en la que debería usar una en lugar de la otra?

consejos Por favor,

Gracias de antemano :)

Respuesta

26

Si se llama a la función sin un argumento que los dos para devolver el mismo valor. Pero aceptan diferentes argumentos:

  • SUSER_SNAME() toma la varbinary(85) SID de un inicio de sesión como argumento
  • SUSER_NAME() toma la integer principal_id de un inicio de sesión

Usted puede verificar esto como:

select suser_name(principal_id) 
,  suser_name(sid) 
,  suser_sname(principal_id) 
,  suser_sname(sid) 
from sys.server_principals 
where name = suser_name() 

Solo la primera y la última columna devolverán valores no nulos.

+0

He ejecutado la declaración que proporcionó, y solo la tercera columna era nula, parece que 'SUSER_NAME' acepta tanto' principal_id' como 'sid'. Por cierto, estoy usando SQL Server 2012 si eso importa. –

+1

@ MohammedA.Fadil: Extraño, estoy usando 2012 también, y la columna dos y tres son 'null'. Puede haber un caso de esquina donde 'cast (sid as int)' es igual a 'principal_id', pero eso es muy poco probable – Andomar

+0

@MohammedA.Fadil: ¿Has iniciado sesión como sa cuando viste ese resultado? Veo principal_id = sid para los principales de servidor integrados. –

0

SUSER_NAME() devolverá el nombre asociado con un sid que existe en sys.server_principals. El sid debe existir en sys.server_principals.

SUSER_SNAME() puede hacer eso, pero también puede devolver el SID de un inicio de sesión si el usuario es un miembro de un grupo de directorio activo

Así que si usted tiene [CONTOSO \ MiGrupo] en Active Directory y que el grupo tiene un usuario [CONTOSO \ MyUser]

Y agrega ese grupo a SQL Server: CREAR INICIO DE SESIÓN [CONTOSO \ MyGroup] DESDE WINDOWS;

SELECT SUSER_ID ('CONTOSO \ MyUser'), SUSER_SID ('CONTOSO \ MyUser')

le dará NULL, CONTOSO \ MyUser porque CONTOSO \ MyUser no está en sys.server_principals pero está en una/D