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

#6 Javier Loria
01/12/2006 - 14:52 | Informe spam
Hola:
Que tal la siguiente rima:
Mi amigo Eladio, de SQL un Magnate
pero al mejor mono, se le cae el aguacate
por favor te lo pido, ubicate
que escribir SQL no es tomar chocolate
y ya que este foro es un gran escaparate
te digo, los trigger no tienen tabla update
Saludos,


Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Miguel egea" wrote in message
news:
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
#7 Eladio Rincón
01/12/2006 - 15:12 | Informe spam
:):):)

de Miguel conocía sus facetas culinarias, de Javier su facilidad con los
idiomas (especialmente chino)...
pero vuestra faceta poética me ha sorprendido... ¿habéis considerado
escribir los Training Kits en verso? sería un auténtico puntazo :):):)

Disculpas por el gazapo, quizás presté demasiada atención a explicar el
funcionamiento del trigger... aunque de vez en cuando un verso si que está
bien :)

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:
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
#8 valdez.delia
01/12/2006 - 18:38 | Informe spam
Oskar, los triggers de auditoria son bastante incómodos de programar.
Es mejor que uses alguna herramienta de generación de triggers de
auditoría.

yo estoy usando las herramientas de www.auditdatabase.com que funcionan
para SQL Server y otros DBMS's. Ese sitio tiene una herramienta gratis
de generación de triggers así como otra herramienta también gratis
que genera consultas SQL sobre las tablas de auditoría para poder
recuperar la información de auditoría.



Eladio Rincón ha escrito:

:):):)

de Miguel conocía sus facetas culinarias, de Javier su facilidad con los
idiomas (especialmente chino)...
pero vuestra faceta poética me ha sorprendido... ¿habéis considerado
escribir los Training Kits en verso? sería un auténtico puntazo :):):)

Disculpas por el gazapo, quizás presté demasiada atención a explicar el
funcionamiento del trigger... aunque de vez en cuando un verso si que está
bien :)

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:
> 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
#9 Miguel egea
02/12/2006 - 13:52 | Informe spam
Eres un poeta, no hay duda :)
jajaja
Saludos

"Javier Loria" wrote in message
news:%23FKZo$
Hola:
Que tal la siguiente rima:
Mi amigo Eladio, de SQL un Magnate
pero al mejor mono, se le cae el aguacate
por favor te lo pido, ubicate
que escribir SQL no es tomar chocolate
y ya que este foro es un gran escaparate
te digo, los trigger no tienen tabla update
Saludos,


Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Miguel egea" wrote in message
news:
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




















email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida