viernes, 6 de junio de 2014

IDENTITY - Error de desbordamiento aritmético

Bueno problemilla de hoy.

Tenemos una tabla con un campo id que es identity de tipo smallint
En la tabla hacemos una consulta y solo hay 10 registros
El mayor id es 11
Cuando queremos hacer un insert da un error

Mens. 8115, Nivel 16, Estado 1, Línea 1
Error de desbordamiento aritmético al convertir IDENTITY al tipo de datos smallint.
Desbordamiento aritmético.

Antes de que te vuelvas loco, tal vez se borraron registros y por eso no lo ves (que es lo nos pasó a nosotros)
La solución es resetear el valor de la identidad y se puede hacer por linea de comandos


También es posible hacer un trucante

viernes, 2 de mayo de 2014

Seguridad & Applet & Java


Una curiosidad que nos ha llevado un rato (posiblemente para otros sea obvio)

Creamos un Applet,las utilidades pueden ser vario-pintas. Desde las nuevas versiones de Java, se obliga a que el Applet este firmado por una entidad de confianza. De hecho, si no está firmado bloquea el Applet. Esto es un paso “más” en la seguridad: desde mi punto de vista relativo, estamos suponiendo que los usuarios verán (porque leer es más que improbable) el mensaje del Java y sabrán lo que significa (lo cual es mucho suponer)

Por supuesto hay documentación al respecto:
http://www.java.com/es/download/help/appsecuritydialogs.xml

Cómo firmar el Applet:
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html

Supongamos que lo hemos hecho todo, y después de repasarlo aún tenemos el mensaje de aviso. La pregunta sería: ¿estamos usando una firma valida?. Esa firma la usas para otras cosas, está emitida por una entidad que tú entiendes que es válida. ¿Seguro?

Que entiende Oracle por certificación (CA) de confianza?? Estará en google, pero yo no lo he visto. Lo que es seguro es que está en tu máquina:

En Windows (panel de control/ programas/ java )



Si tu firma no está emitido por un CA valido incluida en esa lista, siempre tendrás el mensajes de aviso. Para que te salga el aviso en azul, tus usuarios tendrán que agregar el certificado de la entidad que generó la firma. Pero nunca verán el logo de Java en el mensaje.
La solución real, es usar un certificado de una CA Valida y tendras el logo de Java

viernes, 18 de abril de 2014

Trigger – SQL server

Chorra pero interesante, si te piden hacer un histórico de un tabla
No vamos a entrar en si es trabajo del administrador, del log… esto es fácil y  rápido
  1. Nos creamos una tabla que tiene la misma estructura que la tabla que queremos auditar backup_movimientos_mitabla , añadiendo 3 campos
    Fecha --> de tipo date
    Movimiento -->de tipo char(1) --> para saber si es un (Insert, Update o Delete)
    Secuencia--> como campo identity y además primary key
  2.  De la tabla que queremos audtiar, añadimos  el siguiente trigger


    CREATE TRIGGER [dbo].[tr_mitabla]
       ON  [dbo].[mitabla]
       AFTER  INSERT,DELETE, UPDATE
    AS
    BEGIN
           -- SET NOCOUNT ON added to prevent extra result sets from
           -- interfering with SELECT statements.
           SET NOCOUNT ON;
           DECLARE @Type as char(1)
           -- Identificar que evento se está ejecutando (Insert, Update o Delete)
    if exists (SELECT * FROM inserted)
      if exists (SELECT * FROM deleted)
           SELECT @Type='U' -- Si es un update
      else                             
           SELECT @Type='I' -- Si es un insert
      else                              
           SELECT @Type='D' --  si es un delete

    -- Ahora guadarmos el cambios segun sea un tipo u otro
     if @Type ='D' or  @Type ='U'
           insert into backup_movimientos_mitabla  select  *, getdate(), @Type  FROM deleted
     else
           insert into backup_movimientos_mitabla  select  *, getdate(), @Type  FROM inserted

    set NoCount OFF;     
    END
     

    Y ya está , lo probamos


    insert into mitabla (column1, column2) values ('9999','Prueba backup');
    update  mitabla set column2='Prueba backup 0 '  where column1 ='9999';
    delete from mitabla where  column1 ='9999';
    select * from backup_movimientos_mitabla





    Como veras cuando hay un update, guardo el valor que había en la tabla, si quisieras guardar tanto el valor anterior como el nuevo tendrías que usar Deleted & Inserted, cuando es de tipo ‘U’


    Claro que hay otra formas:

    Trigger genérico
    Change Data Capture (CDC) y Change Tracking (CT).

    viernes, 4 de abril de 2014

    Contains mayúsculas y minúsculas


    Esto es una curiosidad,

    Quería hacer una filtro, en un datagridview con una caja de texto, algo muy normal

    Un ejemplo super-completo en http://joseluisgarciab.blogspot.com.es/2013/08/filtrar-datagridview-usando-listas.html

    Lo mío era más sencillo, y menos reutilizable, y quería que se filtrara por “contiene”



    olist.ForEach(Sub(a) a.EsVisible = a.NombrePantalla.Contains(txtFiltro.Text))



    Si hago esto me distingue entre mayúsculas y minúsculas.

    Si ya sé que podría hacer:



    olist.ForEach(Sub(a) a.EsVisible = a.NombrePantalla.ToUpper.Contains(txtFiltro.Text.ToUpper))


    Pero me parece más elegante:



    olist.ForEach(Sub(a) a.EsVisible = Regex.IsMatch(a.NombrePantalla, txtFiltro.Text, RegexOptions.IgnoreCase))