miércoles, 19 de marzo de 2008

Eliminar usuarios alias

Los alias en SQL sirven para mapear un usuario en una bbdd. A partir de la versión 7.0 se sustituyen por los ‘Roles’, pero se conservan por compatibilidad con versiones anteriores.
Si la bbdd se crea a partir de versiones anteriores (backups o sp_attach) os encontraréis que estos alias aparecen como usuarios huérfanos . Sin emabargo en el Enterprise Manager o Managment Studio no hay señal de ellos.
Un ejemplo de cómo aparecen en sysusers o sys.sysusers :

status 16
name \nombre
roles NULL
altuid 5
hasdbaccess 0
islogin 1
isntname 0
isntgroup 0
isntuser 0
issqluser 0
isaliased 1
issqlrole 0
isapprole 0

Si analizamos el procedimiento sp_addalias, vemos que status= 16 indica que el usuario es un alias.
-- INSERT SYSUSERS ROW --
insert into sysusers select
@newuid, @status | 16, @loginame, @sid, 0x00,
getdate(), getdate(), @targuid, NULL

La barra inclinada [\] es otro distintivo que SQL Server añade al crear un nuevo alias con el fin de evitar conflictos en names space :

- ALTER NAME TO AVOID CONFLICTS IN NAME SPACE --
select @loginame = '\' + @loginame


i se intenta elimiar el alias con sp_dropalias resulta el siguiente error:

Server: Msg 15401, Level 11, State 1, Procedure sp_dropalias, Line 49
Windows NT user or group '[\nombre]' not found. Check the name again.

Sp_helpuser ‘\nombre’ tambíen da error:

Server: Msg 15198, Level 16, State 1, Procedure sp_helpuser, Line 189
The name supplied ([\nombre ]) is not a user, role, or aliased login.

La causa es que el alias está huérfano; el/los usuario/s a los que estaba asociado no existen en la base de datos.
La solución es crear un nuevo usuario al que se le asignará el mismo sid :

sp_addlogin @loginame = 'test, @passwd = 'test', @sid = 0x sid del alias

Y ahora ya se puede eliminar el alias:

Sp_dropalias ‘\nombre’

No hay comentarios: