jueves, 5 de marzo de 2015

Crear Trigger en SQL para insertar un registro en el que algunos campos son de tipo "no null"

Tenemos un proceso para alimentar una tabla de navision directamente desde sql. El proceso unicamente alimenta dos campos que son el campo1 y el campo4 y quieren que se calculen el campo2 y campo3 qeu corresponden a la fecha y hora. la tabla también tiene los 4 campos definidos como no Null por lo que necesitamos que esos campos se cumplimente al insertar sin dar error ya que como hemos mencionado antes dos de los campos los tenemos que calcular, la cuestión es ¿cuando?.

Lo que hemos hecho ha sido utilizar el desencadenante INSTEAD OF INSERT, el desencadenador INSTEAD OF INSERT de una vista o tabla genera una instrucción INSERT en la tabla base mediante los datos de la tabla inserted asi tenemos acceso a los campos del registro que se está insertando, al realizar el insert sobre la tabla real dentro del trigger disponemos (consulta select de la tabla inserte) el valor de los campos insertados los dos que no venian informados los hemos calculado.

Para calcular el time lo que ponemos es la parte de fecha como a 0 pero en sql no puede haber fecha 0 y lo que hacemos es coger la primera fecha disponible "1754-01-01" y cumplimentamos la parte de la hora.  
"CAST('1754-01-01 '+CONVERT(CHAR(8), GETDATE(), 108) AS DATETIME)"

Para calcular la fecha lo que hacemos es poner la fecha de hoy y completamos a 0 la hora.
"CONVERT(CHAR(10),GETDATE(), 120)"

Definición de la tabla TablaEjemplo
Campo1 nvarchar(2)
Campo2 Fecha datetime
Campo3 Time datetime
Campo4 int

ALTER TRIGGER [dbo].[ActualizarFechas]
ON [dbo].[TablaEjemplo]
       INSTEAD OF INSERT
          AS BEGIN
            declare @cpo1 nvarchar(2); declare @cpo2 int;

            SELECT @cpo1= CampoTabla1,@cpo2=CampoTabla4
            FROM inserted
            INSERT INTO [dbo].[TablaEjemplo] ([Maquina],[Fecha],[Hora],[Contador])
            VALUES (@cpo1,
                            CONVERT(CHAR(10),GETDATE(), 120),
                            CAST('1754-01-01 '+CONVERT(CHAR(8), GETDATE(), 108) AS DATETIME),
                           @cpo2)
END