Obtener la lista de bases de datos a las que tiene acceso un usuario

25/09/2008 - 11:04 por jorkam2000 | Informe spam
Me gustaría saber si existe alguna forma (mediante instrucciones de
Transact-SQL) de obtener la lista de bases de datos a las que tiene
acceso un usuario determinado.

He estado mirando las vistas del sistema (sys.databases,
sys.database_principals, sys.server_principals, ..) pero no logro
hayar la solución.

Gracias a todos.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
25/09/2008 - 13:59 | Informe spam
Una posible forma seria impersona??? (impersonating) el usuario sobre el cual
necesitas informacion y usar:

EXECUTE AS USER = 'usuario_en_cuestion';

EXEC sp_msforeachdb N'select ''?'', system_user, suser_sname(),
has_dbaccess(''?'')';

revert;
GO

Yo no he probado esta forma en su totalidad, por ejemplo, que pasa si el
usuario_en_question no tiene acceso a una de las db. Tambien debes tener en
cuenta que quien ejecuta este script, debe tener permiso para impersonar al
usuario 'usuario_en_cuestion' y que el procedimiento usado en este script no
esta documentado en los BOL, por lo que no se debe depender de este si lo
piensas hacer en produccion.


AMB
"" wrote:

Me gustaría saber si existe alguna forma (mediante instrucciones de
Transact-SQL) de obtener la lista de bases de datos a las que tiene
acceso un usuario determinado.

He estado mirando las vistas del sistema (sys.databases,
sys.database_principals, sys.server_principals, ..) pero no logro
hayar la solución.

Gracias a todos.

Respuesta Responder a este mensaje
#2 Alejandro Mesa
25/09/2008 - 14:11 | Informe spam
Bueno, al parecer el procedimiento sp_msforeachdb solo atraviesa las db donde
el usuario tiene permiso, asi que no veras las db donde el usuario no tiene
acceso. Trata con esta otra version.

CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';
GO

CREATE USER user1 FOR LOGIN login1;
GO

DECLARE @dbn sysname
DECLARE c CURSOR LOCAL STATIC
FOR
SELECT [name]
FROM sys.databases

OPEN c

WHILE 1 = 1
BEGIN
FETCH NEXT FROM c INTO @dbn

IF @@ERROR <> 0 OR @@FETCH_STATUS <> 0 BREAK

EXECUTE AS USER = 'user1';
SELECT SUSER_SNAME(), SYSTEM_USER, @dbn, HAS_DBACCESS(@dbn)
REVERT;
END

CLOSE c
DEALLOCATE c
GO

DROP LOGIN login1;
GO

DROP USER user1;
GO


AMB



"Alejandro Mesa" wrote:

Una posible forma seria impersona??? (impersonating) el usuario sobre el cual
necesitas informacion y usar:

EXECUTE AS USER = 'usuario_en_cuestion';

EXEC sp_msforeachdb N'select ''?'', system_user, suser_sname(),
has_dbaccess(''?'')';

revert;
GO

Yo no he probado esta forma en su totalidad, por ejemplo, que pasa si el
usuario_en_question no tiene acceso a una de las db. Tambien debes tener en
cuenta que quien ejecuta este script, debe tener permiso para impersonar al
usuario 'usuario_en_cuestion' y que el procedimiento usado en este script no
esta documentado en los BOL, por lo que no se debe depender de este si lo
piensas hacer en produccion.


AMB
"" wrote:

> Me gustaría saber si existe alguna forma (mediante instrucciones de
> Transact-SQL) de obtener la lista de bases de datos a las que tiene
> acceso un usuario determinado.
>
> He estado mirando las vistas del sistema (sys.databases,
> sys.database_principals, sys.server_principals, ..) pero no logro
> hayar la solución.
>
> Gracias a todos.
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida