use sybsystemprocs go print 'Creando procedimiento almacenado ''sp_errorlog''...' go if exists( select * from sysobjects where name='sp_errorlog' ) drop proc sp_errorlog go /* ** sp_errorlog ** ** Descripcion: ** Permite llevar a cabo varias operaciones sobre los logs de errores de los servidores Sybase. ** ** Uso: ** [ exec ] sp_errorlog '', 'truncate' ** [ exec ] sp_errorlog '', 'backup' ** [ exec ] sp_errorlog '', 'rotate' ** [ exec ] sp_errorlog '', 'view' [, 'pattern' ] ** Sin parámetros muestra la ayuda. ** ** Donde: ** : es la ruta completa y nombre del log de errores. ** 'truncate': trunca el log de errores (elimina el contenido). ** 'backup' : genera una copia de respaldo del log de errores a un archivo llamado ** .YYYYMMDD.hhmmss. ** 'rotate' : trunca y genera una copia de respaldo del log de errores. ** 'view' : muestra el contenido del log de errores. Si se especifica 'pattern', ** muestra solo las lineas que contienen el patrón especificado. ** ** Retorna: ** 0: Ejecucion exitosa. ** -1: Errores de ejecución. ** ** Versión de ASE: ** 12.5.x con ASE_XFS ** 15.0 en Adelante ** ** Historia: ** Version Fecha Notas ** ======= =========== ========================================================= ** 0.1 May 14/2007 Versión inicial del procedimiento almacenado. ** ** Autor: ** Juan C. Avila, e-mail: javila@sybasease.info ** ** Legal: ** Antes de instalar y usar este software, por favor lea detenidamente ** el aviso sobre aspectos legales en http://www.sybasease.info/legal */ create procedure sp_errorlog @errorlog varchar(16384) = NULL, @opt varchar(15) = NULL, @pattern varchar(255) = NULL as /* Variables locales */ declare @errorlog_bak varchar(16384), @sql varchar(16384), @ret_status int, @records int set @ret_status = 0 /* No hay parámetros, muestra la ayuda */ if @errorlog is NULL goto Usage /* Verifica que la opción especificada sea válida */ if lower( @opt ) not in ( 'truncate', 'backup', 'rotate', 'view' ) begin if @opt is NULL print 'Error: Please specify a valid option: ''truncate'', ''backup'', ''rotate'' or ''view''.' else print 'Error: ''%1!'' is not a valid usage option.', @opt set @ret_status = -1 goto Usage end /* Se requiere rol 'sa_role' para ejecutar éste procedimiento */ if proc_role('sa_role') != 1 begin set @ret_status = -1 goto End_Proc end /* Opciones para la sesión */ if @@trancount > 0 begin /* 17260, "Can't run %1! from within a transaction." */ raiserror 17260, "sp_errorlog" set @ret_status = 1 goto End_Proc end else set chained off set transaction isolation level 1 set nocount on /* Si las tablas proxy existen, eliminelas antes de continuar */ if exists( select * from sysobjects where name='x_srv_errorlog') drop table x_srv_errorlog if exists( select * from sysobjects where name='x_srv_errorlog_bak') drop table x_srv_errorlog_bak /* Crea la tabla proxy asociada el log de errores actual */ /* Nota: Se debe usar exec() ya que CREATE PROXY_TABLE no se permite dentro de un SP */ set @sql = 'create proxy_table x_srv_errorlog external file at '''+@errorlog+'''' exec( @sql ) if not exists( select * from sysobjects where name='x_srv_errorlog' ) begin print 'Error: Proxy table ''x_srv_errorlog'' was not created.' set @ret_status = -1 goto End_Proc end /* Si la opción es 'backup' o 'rotate', copia el contenido del errorlog a otro archivo */ if lower( @opt ) = 'backup' or lower( @opt ) = 'rotate' begin /* Define el nombre del archivo de respaldo con formato 'errorlog.AAAAMMDD.hhmmss' */ set @errorlog_bak = @errorlog + "." + convert( char(4), datename( yy, getdate() )) + left( '00', 2-len(convert( varchar(2), datepart( mm, getdate() ))) ) + convert( varchar(2), datepart( mm, getdate() )) + left( '00', 2-len(convert( varchar(2), datepart( dd, getdate() ))) ) + convert( varchar(2), datepart( dd, getdate() )) + "." + left( '00', 2-len(convert( varchar(2), datepart( hh, getdate() ))) ) + convert( varchar(2), datepart( hh, getdate() )) + left( '00', 2-len(convert( varchar(2), datepart( mi, getdate() ))) ) + convert( varchar(2), datepart( mi, getdate() )) + left( '00', 2-len(convert( varchar(2), datepart( ss, getdate() ))) ) + convert( varchar(2), datepart( ss, getdate() )) /* Crea la tabla proxy asociada a la copia del log de errores */ set @sql = 'create proxy_table x_srv_errorlog_bak external file at '''+@errorlog_bak+'''' exec( @sql ) if not exists( select * from sysobjects where name='x_srv_errorlog_bak' ) begin print 'Error: Proxy table ''x_srv_errorlog_bak'' was not created.' set @ret_status = -1 goto End_Proc end /* Copia el contenido del log de errores actual al archivo de respaldo */ set @sql = 'insert into x_srv_errorlog_bak select * from x_srv_errorlog set @records = @@rowcount' exec( @sql ) /* Elimina la tabla proxy asociada a la copia del log de errores. */ if exists( select * from sysobjects where name='x_srv_errorlog_bak' ) drop table x_srv_errorlog_bak print 'Sucessfuly copied %1! records from errorlog to file ''%2!''.', @records, @errorlog_bak end /* Si la opción es 'truncate' o 'rotate', trunca el log de errores actual */ if lower( @opt ) = 'truncate' or lower( @opt ) = 'rotate' begin set @sql = 'truncate table x_srv_errorlog' exec( @sql ) set @sql = 'select @records = count(*) from x_srv_errorlog' exec( @sql ) if @records = 0 print 'Successfuly truncated errorlog ''%1!''.', @errorlog else begin print 'Error: Errorlog was not successfuly truncated.' set @ret_status = -1 goto End_Proc end end /* Si la opción es 'view', muestra el contenido del errorlof actual */ if lower( @opt ) = 'view' begin set @sql = 'select record from x_srv_errorlog' if @pattern is not null set @sql = @sql + ' where record like ''' + @pattern + '''' exec( @sql ) end goto End_Proc Usage: print 'Usage:' print ' [ exec ] sp_errorlog '''', ''truncate''' print ' [ exec ] sp_errorlog '''', ''backup''' print ' [ exec ] sp_errorlog '''', ''rotate''' print ' [ exec ] sp_errorlog '''', ''view'' [, ''pattern'' ]' print 'With no parameters shows this help.' End_Proc: /* Borra las tablas proxy */ if exists( select * from sysobjects where name='x_srv_errorlog' ) drop table x_srv_errorlog if exists( select * from sysobjects where name='x_srv_errorlog_bak' ) drop table x_srv_errorlog_bak return @ret_status go if @@error = 0 print 'Procedimiento almacenado ''sp_errorlog'' creado.' grant exec on sp_errorlog to sa_role go