GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

SQL Server FAQ: ¿Qué diferencia hay entre Inicio de Sesión y Usuario?

Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]


En este capítulo se explica la diferencia entre Inicio de Sesión y Usuario de Base de Datos. Al contrario que en otros motores de base de datos, SQL Server tiene dos niveles de profundidad en la definición de sus Usuarios. Por un lado está el Inicio de Sesión (el usuario con el que nos conectamos, el de la password) y por otro lado está el Usuario de Base de Datos (se le asigna al Inicio de Sesión) que es sobre el que se asignan los permisos de acceso a los objetos de base de datos. Esta es una duda típica en quienes empiezan con SQL Server. También se explicá el SID y el UID, que son los usuarios huérfanos (orphaned users) y como repararlos (sp_change_users_login ), syslogins, sysusers, CREATE LOGIN, CREATE USER, sp_addlogin, sp_grantlogin, sp_adduser, sp_addsrvrolemember, sp_addrolemember, etc.

Un Inicio de Sesión (Login) representa la conexión a la Instancia de SQL Server. Dicha conexión debe validada por algún tipo de servidor de autenticación, de tal modo, que podemos encontrar Inicios de Sesión de Windows (la validación la realiza el Sistema Operativo, y representa al usuario contextual con el que hemos iniciado sesión en Windows) e Inicios de Sesión de SQL Server (la validación la realiza SQL Server, luego es el motor de base de datos quién debe almacenar la contraseña - o su hash - y quién debe validar al usuario).

En cualquier caso, un Inicio de Sesión definido en una Instancia puede pertenecer a determinadas Funciones de Servidor (Server Roles) de dicha Instancia, y cuya pertenencia suele conceder determinados privilegios en dicha Instancia de SQL Server (ej: pertenecer a BULKADMIN permite poder realizar cargas masivas en cualquier base de datos de la Instancia, siempre que además se tengan permisos sobre la tabla de destino, claro).

Por otro lado, ocurre que los objeto a los cuales habitualmente deseamos acceder (procedimientos almacenados, tablas, etc.), se encuentran en una u otra base de datos de la Instancia, es decir, no se encuentra definidos en la Instancia como tal. Por ello, en cada Base de Datos a la que tengamos que acceder deberemos de tener un Usuario. Aquí está la principal diferencia entre ambos conceptos: un Inicio de Sesión (Login) se define a nivel de Instancia mientras que un Usuario se define a nivel de Base de Datos.

Habitualmente, se crea un Inicio de Sesión para una persona (o aplicación) que necesite conectarse a SQL Server, y seguidamente se crea un Usuario para ese Inicio de Sesión sobre la base de datos a la que se desea conceder acceso, de tal modo, que si dicho Inicio de Sesión debe de poder acceder a varias bases de datos, deberá tener un Usuario en cada base de datos.

En las siguientes consultas se muestra como un Inicio de Sesión se almacena en la base de datos master (a nivel de la Instancia) y queda definido por su SID, mientras que los Usuarios se almacenan en cada Base de Datos particular y quedan definidos por su UID aunque tienen asignado el SID que les corresponda según el Inicio de Sesión al que pertenecen (este es el mapeo del que hablábamos).

-- *** Ver los Inicios de Sesión de la Instancia de SQL Server ***
select sid, name
from master..syslogins

-- *** Ver los Usuarios de la Base de Datos actual de SQL Server ***
select uid, name, sid
from sysusers
where islogin=1

A continuación se muestra la forma de crear Inicios de Sesión (Logins) y Usuarios (Users) en SQL Server 2000 y SQL Server 2005. En SQL Server 2005 se dispone de las nuevas sentencias CREATE LOGIN y CREATE USER, aunque aún se mantiene compatibilidad con los procedimientos almacenados sp_addlogin, sp_grantlogin y sp_adduser de versiones anteriores del producto.

-- *** Crear Inicio de Sesión de SQL Server en SQL Server 2000, ***
-- *** hacerlo miembro de dbcreator, y darle permisos de lectura y escritura en Northwind ***
EXEC sp_addlogin 'MyNewLogin', 'P@ssw0rd', 'Northwind'
EXEC sp_addsrvrolemember 'MyNewLogin', 'dbcreator'
USE Northwind
EXEC sp_adduser 'MyNewLogin', 'MyNewUser'
EXEC sp_addrolemember 'db_datareader', 'MyNewUser'
EXEC sp_addrolemember 'db_datawriter', 'MyNewUser'

-- *** Crear Inicio de Sesión de SQL Server en SQL Server 2005, ***
-- *** hacerlo miembro de dbcreator, y darle permisos de lectura y escritura en Northwind ***
CREATE LOGIN MyNewLogin WITH PASSWORD = 'P@ssw0rd', DEFAULT_DATABASE = AdventureWorks
EXEC sp_addsrvrolemember 'MyNewLogin', 'dbcreator'
USE AdventureWorks
CREATE USER MyNewUser FOR LOGIN MyNewLogin
EXEC sp_addrolemember 'db_datareader', 'MyNewUser'
EXEC sp_addrolemember 'db_datawriter', 'MyNewUser'

Un error típico es el de usuarios huérfanos (orphaned users). Consiste en el hecho de tener un Usuario, pero sin tener asociado a él su Inicio de Sesión correspondiente. Pero, y esto, ¿por qué ocurre?. Un caso típico, al restaurar una base de datos en una Instancia distinta de en la que fué creada, aunque puede haber más motivos. Es importante tener en cuenta, que los Inicios de Sesión y los Usuarios se mapean por el ID del Inicio de Sesión (SID), no por el nombre del Inicio de Sesión (no vale crear un Inicio de Sesión con el mismo nombre). Pero ¿cómo lo solucionamos?. En SQL Server 2000 y versiones anteriores, muchas personas lo solucionaban actualizando manualmente las tablas del catálogo... bien, pues así NO, y de hecho, en SQL Server 2005 no podremos actualizar manualmente los objetos de sistema. La solución para arreglar el problema de usuarios huérfanos es utilizar el procedimiento almacenado del sistema sp_change_users_login, tanto en SQL Server 2000 como en SQL Server 2005. También es posible crear un Inicio de Sesión de SQL Server con el SID que deseemos, si lo especificamos en CREATE LOGIN o en sp_addlogin (ver la ayuda del producto para más información). A continuación se muestra un ejemplo de sp_change_users_login.

USE Northwind
GO
EXEC sp_change_users_login 'Update_One', 'ExistingUser', 'NewLogin'

Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]




Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Marzo de 2019 (1)
Octubre de 2018 (1)
Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.