print 'Creando procedimiento almacenado sp_helplogin...' go use sybsystemprocs go if exists( select * from sysobjects where name = 'sp_helplogin' ) drop proc sp_helplogin go /***********************************************************************/ /* sp_helplogin -- Lista informacion basica de los logins del servidor */ /* */ /* Uso: */ /* sp_helplogin */ /* sp_helplogin @def_dbname= */ /* sp_helplogin @role= */ /* sp_helplogin @def_dbname=, @role= */ /* sp_helplogin '' */ /* sp_helplogin '', 'full' */ /* sp_helplogin @opt='help' or sp_helplogin null, 'help' */ /* */ /* Donde: */ /* = nombre de una base de datos */ /* = nombre de un rol o 'no role' */ /* = nombre de un login */ /* */ /* Versiones de ASE soportadas: 12.5.1 en Adelante */ /* Autor: Juan Carlos Avila -- javila@sybasease.info */ /* Historia: */ /* 0.1 -- 12/04/2006 -- Version inicial. */ /* 0.2 -- 12/06/2006 -- Se agregaron mas opciones. */ /* 0.3 -- 05/04/2007 -- Se agrego la columna 'locked' a la salida. */ /* */ /* Legal: */ /* Antes de instalar y usar este software, por favor lea detenidamente */ /* el aviso sobre aspectos legales en http://www.sybasease.info/legal */ /***********************************************************************/ create proc sp_helplogin @login_name varchar(30) = NULL, @opt varchar(10) = NULL, @def_dbname varchar(30) = NULL, @role varchar(30) = NULL as -- Variable local para manejar el valor retornado. declare @ret_status int set @ret_status = 0 -- Define algunas opciones de sesión. if @@trancount = 0 begin set chained off end set transaction isolation level 1 set nocount on -- Si @login_name = NULL, la unica opcion valida es 'help' o no especificar opcion. if @login_name is null begin if lower(@opt) = 'help' goto Usage else if @opt is not null begin print "'%1!' is not a valid display option.", @opt set @ret_status = 1 goto Usage end end else -- Si @login_name <> NULL, la unica opcion válida es 'full' begin if @opt is not null and lower(@opt) <> 'full' begin print "'%1!' is not a valid display option when used with .", @opt set @ret_status = 1 goto Usage end end -- Si el usuario especifica @login_name, verifica que este exista. if @login_name is not null and not exists(select * from master..syslogins where name=@login_name) begin print "No login with the specified name exists." set @ret_status = 1 goto End_Proc end -- Si el usuario especifica @login_name y la opcion 'full', invoque sp_displaylogin. if @login_name is not null and lower(@opt) = "full" begin declare @msg varchar(255) set @msg = "Extended info for login name '"+@login_name+"'" print @msg set @msg = replicate("-", len(@msg)) print @msg exec @ret_status = sp_displaylogin @login_name goto End_Proc end -- Definición de variables locales. declare @name varchar(30), @suid int, @roles_list varchar(255), @dbname varchar(30), @i int, @j int, @max_roles_list_len int, @max_login_name_len int, @max_dbname_len int, @max_suid_len int, @row_count int, @status smallint -- Declaración del cursor para obtener la información de los logins. declare logins_crsr -- Quitar el comentario siguiente para ASE 15.x --insensitive no scroll cursor for select suid, dbname, name, status from master..syslogins for read only -- Tabla temporal. Contendra la informacion resumida de los logins. create table #_logins(suid varchar(15), login_name varchar(30), default_dbname varchar(30), roles_list varchar(255), locked varchar(3)) -- Abre el cursor y lee el primer login. open logins_crsr fetch logins_crsr into @suid, @dbname, @name, @status -- Proceso cada login leido. while @@sqlstatus = 0 begin -- Tabla temporal. Contendra la lista de roles para el login actual. create table #_roles(id int identity, role_name varchar(30)) insert into #_roles(role_name) select ssr.name from master..syslogins sl, master..syssrvroles ssr, master..sysloginroles slr where sl.suid = slr.suid and slr.srid = ssr.srid and sl.name = @name -- Construye la lista de roles para el login actual. set @roles_list = "" set @i = 1 select @j = count(*) from #_roles while @i <= @j begin select @roles_list = @roles_list + role_name + ", " from #_roles where id = @i set @i = @i + 1 end -- Le da formato a la lista de roles. if @roles_list = "" set @roles_list = " No roles. " set @roles_list = substring(@roles_list, 2, len(@roles_list)-3) -- Inserta en la tabla temporal de logins los valores para el login actual. insert into #_logins values(convert(varchar(15),@suid),@name,@dbname,@roles_list,case @status&2 when 2 then 'Yes' else 'No' end) fetch logins_crsr into @suid, @dbname, @name, @status -- Borra la tabla temporal de roles; esta sera reconstruida para el siguiente login. drop table #_roles end -- Cierra y libera el cursor. close logins_crsr deallocate cursor logins_crsr -- Calcula la longitud maxima de algunos campos de la tabla temporal. select @max_roles_list_len = max(len(roles_list)) from #_logins select @max_login_name_len = max(len(login_name)) from #_logins select @max_dbname_len = max(len(default_dbname)) from #_logins select @max_suid_len = max(len(suid)) from #_logins -- Obtiene la informacion resumida de la tabla temporal y le da formato. declare @sql varchar(1024) set @sql = "select left(suid,"+convert(varchar(15),@max_suid_len)+") as suid,left(login_name,"+convert(varchar(5),@max_login_name_len)+") as login_name, left(default_dbname,"+convert(varchar(5),@max_dbname_len)+") as default_dbname,left(roles_list,"+convert(varchar(5),@max_roles_list_len)+") as roles_list, locked from #_logins" if @login_name is not null set @sql = @sql + " where login_name = '" + @login_name + "'" else begin set @sql = @sql + " where 1=1" if @def_dbname is not null set @sql = @sql + " and lower(default_dbname) = lower('" + @def_dbname + "')" if @role is not null set @sql = @sql + " and lower(roles_list) like lower('%" + @role + "%')" end exec( @sql ) set @row_count = @@rowcount if @row_count=1 and @login_name is not null print "To obtain detailed information about this login execute sp_helplogin '%1!', 'full'", @login_name if @row_count=0 begin print "No logins found that match the specified search criteria." set @ret_status=1 goto End_Proc end -- Fin del procedimiento. drop table #_logins goto End_Proc -- Mostrar informacion de uso. Usage: print "Usage:" print "sp_helplogin" print "sp_helplogin @def_dbname=" print "sp_helplogin @role=" print "sp_helplogin @def_dbname=, @role=" print "sp_helplogin ''" print "sp_helplogin '', 'full'" print "sp_helplogin @opt='help' or sp_helplogin null, 'help'" End_Proc: return @ret_status go if @@error = 0 print 'Procedimiento sp_helplogin creado.' go Grant Execute on dbo.sp_helplogin to public go sp_procxmode 'sp_helplogin', unchained go setuser go exec sp_helplogin null, 'help' go