Trigger sencillo de Update

01/12/2006 - 12:27 por Oskar | Informe spam
Hola a todos.
Estoy empezando con esto de los Trigger y quisiera saber como hacer un
trigger que grabe un registro en una tabla cada vez que se modifica alguno
de los campos que yo le indique de otra.

Supongamos que yo tengo una tabla que se llama T1 que tiene muchos campos
pero yo solo quiero que grabe en la tabla AUDIT un registro cuando se
modifique el campo C1 o el C2, si se modifica algún otro campo no quiero que
inserte nada.

¿Como haría esto de la forma más sencilla?

Con algún ejemplo que he visto por Internet he hecho esto pero me da error
en el UPDATE()



CREATE TRIGGER [GrabaAudit] ON [dbo].[T1]

FOR UPDATE AS

begin

Declare @Nombre nvarchar(12)

IF (UPDATE(C1) OR UPDATE(C2))

begin

select @Nombre = nombre from update

End



begin

Insert into AUDIT

(Nombre, fecha)

values(@barras,GETDATE())

End


End





Muchas gracias

Preguntas similare

Leer las respuestas

#1 Eladio Rincón
01/12/2006 - 12:47 | Informe spam
Oskar,

debes tener en cuenta que el trigger se activará una y solo una vez por cada
sentencia de actualización. Incluso sin haber modificado ninguna fila.

por lo tanto deberías modificar la consulta de la siguiente forma:


IF (UPDATE(C1) OR UPDATE(C2))
Insert into AUDIT
(Nombre, fecha)
select nombre, getdate() from update


Otra cosa que deberías validar es si realmente hay filas afectadas al entrar
al trigger; recuerda: el trigger se activará independientemente de que haya
o no modificaciones. Por lo que podrías hacer:


if @@rowcount = 0
return

y así te evitas que SQL Server tenga que pasar por el resto del código del
trigger :)





Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Oskar" wrote in message
news:
Hola a todos.
Estoy empezando con esto de los Trigger y quisiera saber como hacer un
trigger que grabe un registro en una tabla cada vez que se modifica alguno
de los campos que yo le indique de otra.

Supongamos que yo tengo una tabla que se llama T1 que tiene muchos campos
pero yo solo quiero que grabe en la tabla AUDIT un registro cuando se
modifique el campo C1 o el C2, si se modifica algún otro campo no quiero
que inserte nada.

¿Como haría esto de la forma más sencilla?

Con algún ejemplo que he visto por Internet he hecho esto pero me da error
en el UPDATE()



CREATE TRIGGER [GrabaAudit] ON [dbo].[T1]

FOR UPDATE AS

begin

Declare @Nombre nvarchar(12)

IF (UPDATE(C1) OR UPDATE(C2))

begin

select @Nombre = nombre from update

End



begin

Insert into AUDIT

(Nombre, fecha)

values(@barras,GETDATE())

End


End





Muchas gracias




Respuesta Responder a este mensaje
#2 Eladio Rincón
01/12/2006 - 12:50 | Informe spam
por cierto,

recuerda también que UPDATE (C1) no garantiza que la fila se haya
modificado; tan sólo te garantiza que la columna C1 forma parte del update.

por ejemplo, si ejecutas:

UPDATE tabla
SET C1 = C1
WHERE 1=0


1) se activará el trigger, a pesar que de no haya ninguna modificación.
2) el bit de UPDATE(C1) será True porque la columna C1 forma parte del SET.




Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Eladio Rincón" wrote in message
news:%
Oskar,

debes tener en cuenta que el trigger se activará una y solo una vez por
cada sentencia de actualización. Incluso sin haber modificado ninguna
fila.

por lo tanto deberías modificar la consulta de la siguiente forma:


IF (UPDATE(C1) OR UPDATE(C2))
Insert into AUDIT
(Nombre, fecha)
select nombre, getdate() from update


Otra cosa que deberías validar es si realmente hay filas afectadas al
entrar al trigger; recuerda: el trigger se activará independientemente de
que haya o no modificaciones. Por lo que podrías hacer:


if @@rowcount = 0
return

y así te evitas que SQL Server tenga que pasar por el resto del código del
trigger :)





Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Oskar" wrote in message
news:
Hola a todos.
Estoy empezando con esto de los Trigger y quisiera saber como hacer un
trigger que grabe un registro en una tabla cada vez que se modifica
alguno de los campos que yo le indique de otra.

Supongamos que yo tengo una tabla que se llama T1 que tiene muchos campos
pero yo solo quiero que grabe en la tabla AUDIT un registro cuando se
modifique el campo C1 o el C2, si se modifica algún otro campo no quiero
que inserte nada.

¿Como haría esto de la forma más sencilla?

Con algún ejemplo que he visto por Internet he hecho esto pero me da
error en el UPDATE()



CREATE TRIGGER [GrabaAudit] ON [dbo].[T1]

FOR UPDATE AS

begin

Declare @Nombre nvarchar(12)

IF (UPDATE(C1) OR UPDATE(C2))

begin

select @Nombre = nombre from update

End



begin

Insert into AUDIT

(Nombre, fecha)

values(@barras,GETDATE())

End


End





Muchas gracias








Respuesta Responder a este mensaje
#3 Oskar
01/12/2006 - 14:04 | Informe spam
Muchas gracias Eladio, pero el tema es que cuando voy a grabar el trigger me
da error en el UPDATE del select, ¿no se llama update la tabla de las
modificaciones?

Yo tengo puesto esto:
Insert into AUDIT
(Nombre, fecha)
select nombre, getdate() from UPDATE

Si en vez de UPDATE pongo UPDATED me deja grabar el trigger pero cuando
modifico un registro de la tabla me dice: "El nombre del objeto UPDATE' no
es valido"

¿Cómo se llama la tabla de UPDATE?
La de INSERT se llama INSERTED y la de DELETE se llama DELETED, ¿no?

Y si no es mucho pedir, ¿como podría decirle que haga el insert solo cuando
haya modificado el valor de C1 o de C2?
Es decir como le digo en el IF si el valor que había antes es distinto del
de ahora...

Muchisimas gracias
Respuesta Responder a este mensaje
#4 Miguel egea
01/12/2006 - 14:09 | Informe spam
No se si os acordáis del un-dos-tres, habían unas figuras que hacían rimas
cuando los concursantes se equivocaban, me gustaban esas rimas y
aprovechando que sé que eladio y yo nos partiremos derisa con esto en la
proxima cervecita digo:

Estuvite despistadeted
no existe la tabla updated

vamos que existirán 2 una llamada deleted y otra inserted
Para lo que quieres hacer igual te vale esto
http://www.configuracionesintegrale...p?articulo†



"Eladio Rincón" wrote in message
news:
por cierto,

recuerda también que UPDATE (C1) no garantiza que la fila se haya
modificado; tan sólo te garantiza que la columna C1 forma parte del
update.

por ejemplo, si ejecutas:

UPDATE tabla
SET C1 = C1
WHERE 1=0


1) se activará el trigger, a pesar que de no haya ninguna modificación.
2) el bit de UPDATE(C1) será True porque la columna C1 forma parte del
SET.




Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Eladio Rincón" wrote in message
news:%
Oskar,

debes tener en cuenta que el trigger se activará una y solo una vez por
cada sentencia de actualización. Incluso sin haber modificado ninguna
fila.

por lo tanto deberías modificar la consulta de la siguiente forma:


IF (UPDATE(C1) OR UPDATE(C2))
Insert into AUDIT
(Nombre, fecha)
select nombre, getdate() from update


Otra cosa que deberías validar es si realmente hay filas afectadas al
entrar al trigger; recuerda: el trigger se activará independientemente de
que haya o no modificaciones. Por lo que podrías hacer:


if @@rowcount = 0
return

y así te evitas que SQL Server tenga que pasar por el resto del código
del trigger :)





Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Oskar" wrote in message
news:
Hola a todos.
Estoy empezando con esto de los Trigger y quisiera saber como hacer un
trigger que grabe un registro en una tabla cada vez que se modifica
alguno de los campos que yo le indique de otra.

Supongamos que yo tengo una tabla que se llama T1 que tiene muchos
campos pero yo solo quiero que grabe en la tabla AUDIT un registro
cuando se modifique el campo C1 o el C2, si se modifica algún otro campo
no quiero que inserte nada.

¿Como haría esto de la forma más sencilla?

Con algún ejemplo que he visto por Internet he hecho esto pero me da
error en el UPDATE()



CREATE TRIGGER [GrabaAudit] ON [dbo].[T1]

FOR UPDATE AS

begin

Declare @Nombre nvarchar(12)

IF (UPDATE(C1) OR UPDATE(C2))

begin

select @Nombre = nombre from update

End



begin

Insert into AUDIT

(Nombre, fecha)

values(@barras,GETDATE())

End


End





Muchas gracias












Respuesta Responder a este mensaje
#5 Miguel egea
01/12/2006 - 14:16 | Informe spam
Hola oscar mira mi post.Creo que te puede ayudar.
"Oskar" wrote in message
news:
Muchas gracias Eladio, pero el tema es que cuando voy a grabar el trigger
me da error en el UPDATE del select, ¿no se llama update la tabla de las
modificaciones?

Yo tengo puesto esto:
Insert into AUDIT
(Nombre, fecha)
select nombre, getdate() from UPDATE

Si en vez de UPDATE pongo UPDATED me deja grabar el trigger pero cuando
modifico un registro de la tabla me dice: "El nombre del objeto UPDATE' no
es valido"

¿Cómo se llama la tabla de UPDATE?
La de INSERT se llama INSERTED y la de DELETE se llama DELETED, ¿no?

Y si no es mucho pedir, ¿como podría decirle que haga el insert solo
cuando haya modificado el valor de C1 o de C2?
Es decir como le digo en el IF si el valor que había antes es distinto del
de ahora...

Muchisimas gracias

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida