- sudo apt-add-repository ppa:jtaylor/keepass
- sudo apt-get update
- sudo apt-get install keepass2
programacion-x
Destinado a tips y cosas relacionadas con el mundo de la programación en .NET y Java, así como bases de datos en SQL Server.
Contenido del Blog
- - [ ¿Cómo excluir la máscara del texto de un control MaskedTextBox de .NET 2008? ]
- - [ ¿Cómo listar las tablas existentes de una BD y cuántos registros tienen c/u? ]
- - [ ¿Cómo listar las tablas existentes de una BD, la cantidad de registros y el espacio ocupado? ]
- - [ ¿Cómo obtener la configuración, la instalación y la información de volcado de memoria en SQL Server 2012? ]
- - [ ¿Cuántas filas retorna un ResultSet? - Java ]
- - [ Aplicativos útiles y gratuitos ]
- - [ Cómo identificar bloqueos en SQL Server ]
- - [ Cómo mostrar los procedimientos almacenados y/o las vistas de una Base de Datos con todo y su código ]
- - [ Encryptación a nivel de columna en SQL Server ]
- - [ esIPv4 en Java ]
- - [ Fragmentación de Índices en SQL Server ]
- - [ isNumeric( String ) en Java ]
- - [ KeePass en distros Debian ]
- - [ Manejo de errores en SQL Server ]
- - [ Manipulación de los datos de un ResultSet en Java ]
- - [ Paginación de filas desde SQL ]
- - [ Procedimiento almacenado en SQL Server para generar contraseñas aleatorias ]
- - [ Script para FullBackup en SQL Server 2008 ]
- - [ tieneCamposVacios( Component ) : boolean - Java ]
- - [ Valor por omisión para una columna de tipo Fecha en MySQL ]
sábado, 10 de noviembre de 2012
KeePass para distros Debian
KeePass Password Safe, instalación desde un distro basado en Debian:
viernes, 27 de julio de 2012
Cómo identificar bloqueos en SQL Server
SQL Server es capaz recibir solicitudes de servicio de un gran número de usuarios concurrentes. Cuando SQL Server atiende las solicitudes de muchos clientes, hay una gran posibilidad de que se produzcan conflictos si diferentes procesos solicitan el acceso a los mismos recursos al mismo tiempo. Un conflicto en el que un proceso está esperando otro para liberar un recurso se llama bloqueo. Si bien en SQL Server un proceso bloqueado se resuelve cuando el primer proceso libera el recurso, pero hay veces en que un proceso mantiene un bloqueo de transacción y no lo libera. Aquí les dejo diferentes técnicas para detectar bloqueos y solucionar los problemas en SQL Server.
Nuevamente les dejo un resumen-traducción de una publicación de MSSQLTips escrita por Basit Farooq.
Ver los procesos bloqueados:
Ver los bloqueos según su estado (
La columna
La vista dinámica
Los muy conocidos
Y para matar un proceso tenemos la instrucción
Para mayor información sobre este tema los invito a visitar la artículo original haciendo click AQUÍ o enviándome un mensaje, saludos.
Nuevamente les dejo un resumen-traducción de una publicación de MSSQLTips escrita por Basit Farooq.
Ver los procesos bloqueados:
- USE [master]
- GO
- SELECT session_id
- ,blocking_session_id
- ,wait_time
- ,wait_type
- ,last_wait_type
- ,wait_resource
- ,transaction_isolation_level
- ,lock_timeout
- FROM sys.dm_exec_requests
- WHERE blocking_session_id <> 0
- GO
GRANT-WAIT-CONVERT
):
- USE [master]
- GO
- SELECT * from sys.dm_tran_locks
- WHERE request_status = 'CONVERT'
- GO
request_session_id
contiene el ID del proceso. Para ver el bloqueo en una base de datos particular, ejecutar la siguiente consulta, que une sys.dm_tran_locks
con sys.partitions
:
- USE [master]
- GO
- SELECT tl.resource_type
- ,tl.resource_associated_entity_id
- ,OBJECT_NAME(p.object_id) AS object_name
- ,tl.request_status
- ,tl.request_mode
- ,tl.request_session_id
- ,tl.resource_description
- FROM sys.dm_tran_locks tl
- LEFT JOIN sys.partitions p
- ON p.hobt_id = tl.resource_associated_entity_id
- WHERE tl.resource_database_id = DB_ID()
- GO
sys.dm_os_waiting_tasks
nos brinda información sobre bloqueos y procesos bloqueados. Los procesos bloqueados están listados en la columna
session_id y los bloqueos en blocking_session_id
.
- USE [master]
- GO
- SELECT w.session_id
- ,w.wait_duration_ms
- ,w.wait_type
- ,w.blocking_session_id
- ,w.resource_description
- ,s.program_name
- ,t.text
- ,t.dbid
- ,s.cpu_time
- ,s.memory_usage
- FROM sys.dm_os_waiting_tasks w
- INNER JOIN sys.dm_exec_sessions s
- ON w.session_id = s.session_id
- INNER JOIN sys.dm_exec_requests r
- ON s.session_id = r.session_id
- OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) t
- WHERE s.is_user_process = 1
- GO
sp_who/sp_who2
nos brindan información sobre todas las sesiones establecidas con la BD y sus respectivos ID (ipid
). Ambos procedimientos aceptan parámetros. La columna blk
de sp_who y la columna blkby
de sp_who2 contienen el spid de procesos bloqueados.
- USE master
- GO
- EXEC sp_who 'active';
- -- EXEC sp_who2 'active';
- GO
KILL
. Se puede utilizar la instrucción KILL para ver el estado de un proceso o matarlo:
- USE master
- GO
- KILL spid | UOW [WITH STATUSONLY]
- GO
viernes, 11 de mayo de 2012
esIPv4 en Java
Método en Java que determina si un String corresponde a un IPv4 válida.
Recuerden que el javadoc es un documento html generado, por lo tal debemos utilizar el &_acute;
cuando necesitamos puntuación en la documentación del m
étodo; y para que los mensajes en pantalla se generen con puntuación debemos utilizar las salidas unicode con el \uXXXX, con esto nos aseguramos que los símbolos y caracteres especiales se muestren correctamente en cualquier SO.
/**
* M&eacte;todo que verifica si el String ingresado corresponde a una dirección IP v4.
* @param ip IP a verificar.
* @return true
Si el String ingresado corresponde a una dirección IP v4.
* @throws java.lang.Exception En caso de que el String ingresado no respete las reglas de una IP v4.
*/
public static boolean esIPv4( String ip ) throws Exception{
try{
/* Verificacion de la longitud del texto. */
if( ip == null || ip.trim().length() < 7 ){
return false;
}
/* Segmentacion de los valores de la IP. */
String[] temp = ip.split( "\\." );
/* Verificacion de la cantidad de octetos ingresados. */
if( temp.length != 4 ){
return false;
}
/* Que todos los octetos sean un numero. */
/* Ver metodo isNumeric( String ) en mi blog. */
for( String oct : temp ){
if( !isNumeric(oct) ){
return false;
}
}
/* Limites de valores permitidos en los octetos. */
int[] dir = new int[]{
Integer.parseInt( temp[0] ),
Integer.parseInt( temp[1] ),
Integer.parseInt( temp[2] ),
Integer.parseInt( temp[3] )
};
if( dir[0] > 254 || dir[0] <= 0 ||
dir[1] > 254 || dir[1] < 0 ||
dir[2] > 254 || dir[2] < 0 ||
dir[3] > 254 || dir[3] <= 0 ){
return false;
}
return true;
}catch( Exception ex ){
throw new Exception(
"Error en el m\u00c9todo: esIPv4( String )\n - " + ex.getMessage()
);
}
}
lunes, 19 de marzo de 2012
Valor por omisión para una columna de tipo Fecha en MySQL
Bueno en Microsoft SQL Server estamos acostumbrados a asignar un valor por omisión para un campo de una tabla de tipo DateTime utilizando la función getDate(), pero en MySQL el asunto es algo distinto, en pocas palabras, el campo debe ser de tipo: TIMESTAMP y el valor por omisión debe ser: CURRENT_TIMESTAMP.
Ejemplo:
CREATE TABLE tbPrueba(
campo1 VARCHAR(32),
campo2 TIMESTAMP default CURRENT_TIMESTAMP
)
Ejemplo:
CREATE TABLE tbPrueba(
campo1 VARCHAR(32),
campo2 TIMESTAMP default CURRENT_TIMESTAMP
)
Script para FullBackup en SQL Server 2008
DECLARE @dia nvarchar(10)
SET @dia = CONVERT( nvarchar(10), getDate(), 20 )
DECLARE @strSQL nVarchar(MAX) = 'BACKUP DATABASE [miBaseDatos] TO DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH NOFORMAT, NOINIT, NAME = N''miBaseDatos-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10, CHECKSUM'
exec( @strSQL )
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'miBaseDatos' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'miBaseDatos' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''miBaseDatos'' not found.', 16, 1) end
-- Verificar el BK! Importante!
SET @strSQL = 'RESTORE VERIFYONLY FROM DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH FILE = '+ CAST( @backupSetId as nVarchar(MAX) ) +', NOUNLOAD, NOREWIND'
exec( @strSQL )
SET @dia = CONVERT( nvarchar(10), getDate(), 20 )
DECLARE @strSQL nVarchar(MAX) = 'BACKUP DATABASE [miBaseDatos] TO DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH NOFORMAT, NOINIT, NAME = N''miBaseDatos-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10, CHECKSUM'
exec( @strSQL )
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'miBaseDatos' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'miBaseDatos' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''miBaseDatos'' not found.', 16, 1) end
-- Verificar el BK! Importante!
SET @strSQL = 'RESTORE VERIFYONLY FROM DISK = N''C:\miBaseDatos\BackUps\miBaseDatos bkFull ' + @dia + '.bak'' WITH FILE = '+ CAST( @backupSetId as nVarchar(MAX) ) +', NOUNLOAD, NOREWIND'
exec( @strSQL )
miércoles, 1 de febrero de 2012
Fragmentación de Índices en SQL Server
Nuevamente le muestro un resumen traducido del artículo "Stairway to SQL Server Indexes: Level 11, Index Fragmentation" de David Durant, 2012/02/01 SQL Server Central y por supuesto información que agrego de mis experiencias con la herramienta ^_^
¿Qué es la fragmentación?
La fragmentación del índice se presenta en dos variedades: la fragmentación interna y fragmentación externa. La mejor herramienta para la determinación de la fragmentación, ya sea interna o externa de un índice es la función de administración dinámica sys.dm_db_index_physical_stats. Debido a que esta función muestra el identificador de índice pero no el nombre del índice, las consultas a menudo se unen a la vista sys.indexes, a fin de incluir el nombre del índice en la salida.
Fragmentación Interna
Cada página puede contener un número determinado de entradas. Eso no significa que una página siempre tiene el número máximo de entradas. Por lo general, una página de índice no está completamente lleno. Cuando decimos índice de fragmentación interna, nos referimos a que las páginas no están completamente llenas. La cantidad promedio de espacio ocupado por página en un índice es una medida de la fragmentación interna del índice. Tenga en cuenta que cuanto mayor sea la medición, menor será la fragmentación interna, una página que es de 100% de su capacidad no tiene fragmentación interna.
La fragmentación interna es normalmente expresada como un porcentaje, e indica la plenitud de bytes, no en las entradas. Por lo tanto, una página de índice que tiene una fragmentación interna de 96% podría estar completamente lleno. Es decir, un 4% de la página podría no ser suficiente espacio para una nueva entrada que se añade. Cuando el espacio ocupado por la información de encabezado de página y la página de consejos de compensación se explica, una página cuyo índice de entradas individuales son relativamente grandes puede ser "completo" en un 90%, 80% o incluso menos ..
La función sys.dm_db_index_physical_stats muestra la fragmentación interna en su columna de salida avg_page_space_used_in_percent. Ejemplo:
¿Qué es la fragmentación?
La fragmentación del índice se presenta en dos variedades: la fragmentación interna y fragmentación externa. La mejor herramienta para la determinación de la fragmentación, ya sea interna o externa de un índice es la función de administración dinámica sys.dm_db_index_physical_stats. Debido a que esta función muestra el identificador de índice pero no el nombre del índice, las consultas a menudo se unen a la vista sys.indexes, a fin de incluir el nombre del índice en la salida.
Fragmentación Interna
Cada página puede contener un número determinado de entradas. Eso no significa que una página siempre tiene el número máximo de entradas. Por lo general, una página de índice no está completamente lleno. Cuando decimos índice de fragmentación interna, nos referimos a que las páginas no están completamente llenas. La cantidad promedio de espacio ocupado por página en un índice es una medida de la fragmentación interna del índice. Tenga en cuenta que cuanto mayor sea la medición, menor será la fragmentación interna, una página que es de 100% de su capacidad no tiene fragmentación interna.
La fragmentación interna es normalmente expresada como un porcentaje, e indica la plenitud de bytes, no en las entradas. Por lo tanto, una página de índice que tiene una fragmentación interna de 96% podría estar completamente lleno. Es decir, un 4% de la página podría no ser suficiente espacio para una nueva entrada que se añade. Cuando el espacio ocupado por la información de encabezado de página y la página de consejos de compensación se explica, una página cuyo índice de entradas individuales son relativamente grandes puede ser "completo" en un 90%, 80% o incluso menos ..
La función sys.dm_db_index_physical_stats muestra la fragmentación interna en su columna de salida avg_page_space_used_in_percent. Ejemplo:
SELECT IX.name AS 'Name'
, PS.index_level AS 'Level'
, PS.page_count AS 'Pages'
, PS.avg_page_space_used_in_percent AS 'Page Fullness (%)'
FROM sys.dm_db_index_physical_stats(
DB_ID(),
OBJECT_ID('Sales.SalesOrderDetail'),
DEFAULT, DEFAULT, 'DETAILED') PS
JOIN sys.indexes IX
ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
, PS.index_level AS 'Level'
, PS.page_count AS 'Pages'
, PS.avg_page_space_used_in_percent AS 'Page Fullness (%)'
FROM sys.dm_db_index_physical_stats(
DB_ID(),
OBJECT_ID('Sales.SalesOrderDetail'),
DEFAULT, DEFAULT, 'DETAILED') PS
JOIN sys.indexes IX
ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
La primera fila de la salida anterior, nos dice que las filas de la tabla se reparten en 1.234 páginas que son, en promedio, el 99% de su capacidad. En otras palabras, esta tabla tiene un mínimo de fragmentación interna.
Fragmentación Externa
En contraste con la fragmentación interna, la fragmentación externa se refiere a la falta de correlación entre la secuencia lógica de un índice y su secuencia física. También se expresa en porcentajes. Para citar a Microsoft Technet, es "el porcentaje de páginas fuera de orden (out-of-order pages) en las páginas de la hoja de un índice. Una página fuera de orden es una página donde la siguiente página física asignada al índice no es la página a la que apunta el puntero de página-siguiente (next-page) en la página de la hoja actual". Aunque la definición se limita solo a nivel de hoja, se dará cuenta de que sys.dm_db_index_physical_stats puede devolver información de todos los niveles de fragmentación de un índice.
Tenga en cuenta que, a diferencia de la fragmentación interna, un número más alto significa una mayor cantidad de fragmentación externa, por lo que un índice con una fragmentación externa de 100% esta completamente fragmentada externamente. Es decir, no hay correlación alguna entre su secuencia lógica y física de las páginas.
En contraste con la fragmentación interna, la fragmentación externa se refiere a la falta de correlación entre la secuencia lógica de un índice y su secuencia física. También se expresa en porcentajes. Para citar a Microsoft Technet, es "el porcentaje de páginas fuera de orden (out-of-order pages) en las páginas de la hoja de un índice. Una página fuera de orden es una página donde la siguiente página física asignada al índice no es la página a la que apunta el puntero de página-siguiente (next-page) en la página de la hoja actual". Aunque la definición se limita solo a nivel de hoja, se dará cuenta de que sys.dm_db_index_physical_stats puede devolver información de todos los niveles de fragmentación de un índice.
Tenga en cuenta que, a diferencia de la fragmentación interna, un número más alto significa una mayor cantidad de fragmentación externa, por lo que un índice con una fragmentación externa de 100% esta completamente fragmentada externamente. Es decir, no hay correlación alguna entre su secuencia lógica y física de las páginas.
SELECT IX.name AS 'Name',
PS.index_level AS 'Level'
PS.page_count AS 'Pages',
PS.avg_fragmentation_in_percent AS 'External Fragmentation (%)',
PS.fragment_count AS 'Fragments',
PS.avg_fragment_size_in_pages AS 'Avg Fragment Size'
FROM sys.dm_db_index_physical_stats(
DB_ID(),
OBJECT_ID('Sales.SalesOrderDetail'),
DEFAULT, DEFAULT, 'LIMITED') PS
JOIN sys.indexes IX
ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
PS.index_level AS 'Level'
PS.page_count AS 'Pages',
PS.avg_fragmentation_in_percent AS 'External Fragmentation (%)',
PS.fragment_count AS 'Fragments',
PS.avg_fragment_size_in_pages AS 'Avg Fragment Size'
FROM sys.dm_db_index_physical_stats(
DB_ID(),
OBJECT_ID('Sales.SalesOrderDetail'),
DEFAULT, DEFAULT, 'LIMITED') PS
JOIN sys.indexes IX
ON IX.OBJECT_ID = PS.OBJECT_ID AND IX.index_id = PS.index_id
WHERE IX.name = 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID';
GO
Como se especificó 'LIMITED' para el último parámetro, tendremos sólo una fila de salida:
Prevención y Cura para la fragmentación y la división de página
Hay dos opciones para el mantenimiento de índices, la reconstrucción del índice, lo que elimina la fragmentación externa y le da el control sobre el llenado de la página del índice en reconstrucción, y la reorganización del índice, lo que reduce la fragmentación externa y puede aumentar la plenitud de la página.
ALTER INDEX AK_SalesOrderHeader_rowguid
ON Sales.SalesOrderHeader
REBUILD
WITH ( FILLFACTOR = 7 );
GO
Hay dos opciones para el mantenimiento de índices, la reconstrucción del índice, lo que elimina la fragmentación externa y le da el control sobre el llenado de la página del índice en reconstrucción, y la reorganización del índice, lo que reduce la fragmentación externa y puede aumentar la plenitud de la página.
ALTER INDEX AK_SalesOrderHeader_rowguid
ON Sales.SalesOrderHeader
REBUILD
WITH ( FILLFACTOR = 7 );
GO
FILLFACTOR (Factor de Relleno): se utiliza para afinar almacenamiento de datos para los índices y el rendimiento de éste. Cuando se crea un índice o este es reconstruido, el valor del FILLFACTOR determina el porcentaje de espacio en cada página a nivel de hoja para ser llenada con los datos, reservando el resto en cada página como espacio libre para un futuro crecimiento. Por ejemplo, especificando un FILLFACTOR de 80 significa que el 20 por ciento de todas las páginas se deja vacío, proporcionando un espacio para la expansión del índice cuando se agregan datos a la tabla subyacente. El espacio vacío se reserva entre las filas del índice en lugar de al final del índice.
El valor del FILLFACTOR es un porcentaje de 1 a 100, y el valor por defecto a nivel de servidor es 0, lo que significa que las páginas se llenan a capacidad.
Este valor lo debemos utilizar cuando tenemos mucho conocimientos del comportamiento de muestra tabla, por ejemplo, la cantidad de inserciones, actualizaciones, etc. Si tenemos una tabla a la cual solo realizaremos operaciones de INSERT y/o SELECT, el FILLFACTOR podría ser de 100% para llenar completamente las páginas y evitar la fragmentación.
El valor del FILLFACTOR es un porcentaje de 1 a 100, y el valor por defecto a nivel de servidor es 0, lo que significa que las páginas se llenan a capacidad.
Este valor lo debemos utilizar cuando tenemos mucho conocimientos del comportamiento de muestra tabla, por ejemplo, la cantidad de inserciones, actualizaciones, etc. Si tenemos una tabla a la cual solo realizaremos operaciones de INSERT y/o SELECT, el FILLFACTOR podría ser de 100% para llenar completamente las páginas y evitar la fragmentación.
Para información más detallada ingresa al link original, espero les sea de ayuda.
viernes, 13 de enero de 2012
¿Cómo excluir la máscara del texto de un control MaskedTextBox de .NET 2008?
Un tip pequeño pero que tal vez algun@s no han encontrado, es el cómo excluir del texto que retorna un control MaskedTextBox en VB.NET 2008, pues es muy sencillo, puedes jugar con las distintas opciones de la propiedad de este control llamada: TextMaskFormat, en este caso sería el valor: ExcludePromptAndLiterals.
En código VB sería algo así:
mskMiTextBox.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
En código VB sería algo así:
mskMiTextBox.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
Suscribirse a:
Entradas (Atom)