none
Consulta Update RRS feed

  • Pregunta

  • Estimados, tengo un trigger que funciona cuando se actualiza una tabla,

    pero lo que no he podido hacer es que actualice o haga algo, cuando se actualice un campo en particular

    osea por ejemplo si el campo1 <>0 haga esto

    Si el campo2 <>null haga esto otro

    Si el campo3 es 1 haga aquello,

    Saludos y atento a sus comentarios

    miércoles, 24 de junio de 2020 14:21

Respuestas

  • En los triggers, existen dos pseudoTablas, que tienen lo que tenía antes de la update y lo que va a tener después. (digo después porque aunque el trigger sea after update, realmente si haces un rollback en el, el registro no cambia).

    Si observas el ejemplo y le echas un ojo al link que te puse de los triggers, existen dos pseudotablas. Inserted que tiene lo que se ha cambiado, y Deleted que tiene lo que tenía antes, por tanto.

    Si vienen de vacío=> primera update deleted.campo1 is null and inserted.campo1 is not null

    Siguiente update deleted.campo1 is not null (ya se modificó) 

    Con esto es con lo que puedes jugar.


    miércoles, 24 de junio de 2020 16:20

Todas las respuestas

  • Hola Jorge Bertín Corvalán:

    Una de las posibilidades es recoger en el trigger update() y realizar si se cumple algo.

    drop table if exists dbo.ejTrLog;
    drop table if exists dbo.ejTr;
    create table dbo.ejTr (id int, campo1 int, campo2 int, campo3 int)
    go
    create table dbo.ejTrLog (id int identity(1,1), idRecord int, quien varchar(100))
    go
    -- Creamos un trigger de update
    create trigger tr_ejtrupdate_posible1 on dbo.ejTr
    after update
    as
    begin
    	set nocount on;
    	if (update(campo1) ) -- si modifica campo 1
    	begin
    		insert into dbo.ejTrLog (idRecord, quien)
    		select inserted.id, ('campo1')
    		from inserted where campo1<> 0 ; -- y además campo1 es distinto de 0
    	end
    	else 
    	if (update(campo2)) -- si se modifica campo2
    	begin
    	insert into dbo.ejTrLog (idRecord, quien)
    		select inserted.id, ('campo2')
    		from inserted where campo2 is null; -- y además campo2 es distinto de 0
    	end 
    	else 
    	if (update(campo3))  -- si se modifica campo 3
    	begin
    		insert into dbo.ejTrLog (idRecord, quien)
    		select inserted.id, ('campo3')
    		from inserted where campo3<>0; -- y además campo3 es distinto de 0
    	end
    end
    go
    insert into dbo.ejTr (id, campo1, campo2, campo3)
    values
    (1,null, null, null),
    (2,null, null, null),
    (3,null, null, null);
    go
    update dbo.ejTr set campo1 = 3 where id=1;
    update dbo.ejTr set campo2 = 4 where id=2;
    update dbo.ejTr set campo3 = 5 where id=3;
    go
    update dbo.ejTr set campo1= 2 where id in (2,3); -- varios registros a la vez.
    go
    update dbo.ejTr set campo2=null where id = 1;
    go
    select * from dbo.ejTrLog
    

    update()

    https://docs.microsoft.com/es-es/sql/t-sql/functions/update-trigger-functions-transact-sql?view=sql-server-ver15

    Trigger update

    https://javifer2.wordpress.com/2020/04/15/trigger-que-es-como-se-hace-y-como-funciona-after-for-update/

    Cuidado con <> 0 porque null no es distinto de 0

    declare @columna int
    
    if (@columna <> 0)
    	print 'columna es distinto de 0'
    else
    	print 'columna no es distinto de 0'


    miércoles, 24 de junio de 2020 15:40
  • Super claro amigo mio, tengo otra duda como puedo validar el campo1 que solo hago esto si el valor ya fue modificado, se supone que el campo esta vacio, pero si supongamos le pongo 1, va a hacer XXXXX, pero si supongamos me equivoque y edite el campo ya editado, va a reemplazar el valor y agregar uno nuevo, lo que quiero es que sepa que el valor de ese campo ya se había cambiado y no se puede. espero entiendas la consulta

    if (update(campo1) ) -- si modifica campo 1
    	begin.....

    miércoles, 24 de junio de 2020 15:45
  • En los triggers, existen dos pseudoTablas, que tienen lo que tenía antes de la update y lo que va a tener después. (digo después porque aunque el trigger sea after update, realmente si haces un rollback en el, el registro no cambia).

    Si observas el ejemplo y le echas un ojo al link que te puse de los triggers, existen dos pseudotablas. Inserted que tiene lo que se ha cambiado, y Deleted que tiene lo que tenía antes, por tanto.

    Si vienen de vacío=> primera update deleted.campo1 is null and inserted.campo1 is not null

    Siguiente update deleted.campo1 is not null (ya se modificó) 

    Con esto es con lo que puedes jugar.


    miércoles, 24 de junio de 2020 16:20
  •   

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.  

    Eric Ruiz 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    miércoles, 24 de junio de 2020 19:28
  • Muchas Gracias, vamos a hacer las pruebas correspondientes, te agradezco mucho la ayuda.

    Saludos Cordiales

    miércoles, 24 de junio de 2020 19:39
  • Todo ok, voy a plantear lo propuesto para ver como me va.

    gracias

    miércoles, 24 de junio de 2020 19:40