Autoincrementar con Triger

SQL, mySQL, postgreSQL y otros motores
Responder
jvillasenor
Novato
Mensajes: 20
Registrado: Lun Feb 07, 2011 4:34 pm
Contactar:

Autoincrementar con Triger

Mensaje por jvillasenor » Mar Nov 15, 2011 12:53 am

Hola Clarioneros

Estoy trabajando con SQL Firebird / MSSQL 2008 R2, tengo varias Tablas las cuales en el Take Completed saco el ultimo numerico asignado:
'SELECT MAX(CAMPO_ID) FROM TABLA'
Obtenido el valor le sumo 1 para asignar en el insert del campo ID, no quisiera usar Autoincrementos por cuestiones porpias, la pregunta a todo esto es si es posible poner el mismo y/o casi el mismo codigo de sacar el ultimo record y asiganr el No. en un Triger.

Saludos

JM Villasenor


LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: Autoincrementar con Triger

Mensaje por LeoPalomares » Mar Nov 15, 2011 7:18 am

Hola JM,

Si que es posible sólo que hay una pregunta fundamental, necesitás conocer el valor del autoincremental para usarlo en otras tablas?

Es posible aplicar la misma solución en ambos motores mediante un triggger que realice el SELECT MAX(??) pero esta solución es la menos recomendada (potenciales conflictos en entornos con altas concurrencias) y la menos eficiente (los select max con "caros" en tablas con muchos registros).

En SQL Server podés definir el campo a autonumerar como IDENTITY y olvidarte del mismo ya que el lo autonumerará cada vez que realices un insert (eso si, en el dct tendrás que definirlo como readonly porque sino Clarion intentará incluirlo en inserts y updates y el motor dará errores).

En Firebird podés hacer uso de las secuencias (SEQUENCE) para generar el próximo número a utilizar de una manera segura y eficiente. Para "imitirar" el efecto de SQL Server, de que el valor se asigne automáticamente en los inserts, tendrás que crear un trigger asociado a la tabla que será el que obtenga el próximo valor de la secuencia y lo asigne al campo autonumerado.

IMPORTANTE: Esta solución no es válida (la de cualquiera de los dos motores) para los casos en que los números del campo deben ser siempre consecutivos (por ejemplo números de facturas) ya que un número, una vez otorgado, ya no se genera nuevamente.

En el caso de que necesites el número otorgado al autonumerado para usarlo en otras tablas entonces la solución pasa por no usar el trigger en Firebird e invocar a la secuencia desde una función de autonumeración de tu aplicación.
Para SQL Server podés recuperar el valor dado al campo identidad pero esto tiene un par de particularidades, según en que casos (está explicado muy bien en la documentación de SQL Server). Otra alternativa es crearte una tabla que "simule" las secuencias que usa Firebird y que la misma función de autonumeración anterior use esta tabla, en lugar de la secuencia, cuando se trata de SQL Server (esta es mi solución preferida ya que es simple y "ligera", en terminos de eficiencia.
Saludos!!!

Leo Palomares

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 19 invitados