Ayuda con Trigger ....

06/09/2008 - 17:46 por Francizk0 | Informe spam
Q tal gente
Mi problema es que tengo un trigger para INSERT y UPDATE, pero mi duda
es q para la tabla q aplico el trigger exiet un campo [condicion] q
puede tomar valor de 0 o 1,
1. Si hago Insert
1.1 [condicion] = 0 no hace accion alguna
1.2 [condicion] = 1 realizo un proceso

2. Si hago un UpDate
2.1 [condicion] => de 0 a 1 Realizo el proceso
2.2 [condicion] => de 1 a 0 No Pasa este caso ( X )

Pero mi duda es como identifico si es un Insert o un Update.
PDT. Lo dividiria en dos trigger ( INSERT - UPDATE ) pero el problema
es q tb se acen otras procesos relacionados con este y otros campos de
mi tabla.
Lo q intento hacer es algo asi
SELECT @condicion = condicion FROM INSERTED
IF @condicion = 1
SELECT @condicion1 = condicion FROM DELETED
aca es mi duda como identifico si estoi en un Insert o update?? ya
q el deleted solo lo puedo usar en UPDATE, como el proceso q realizo
son de insert me genera errores de PK ya existentes

Alguna Sugerencia
 

Leer las respuestas

#1 Alejandro Mesa
06/09/2008 - 19:22 | Informe spam
Francizk0,

Un par de metodos para identificar el tipo de operacion que disparo el
trigger.

1 - Consultar las tablas [deleted] e [inserted].

Si la operacion es insert, entonces la fila solo aparecera en la tabla
[inserted]. Si la operacion es delete, entonces la fila solo aparecera en la
tabla [deleted]. Si la operacion fue update, entonces la fila aparecera en
ambas tablas, [deleted] e [inserted], ya que SQL Server elimina la fila e
inserta una nueva con el nuevo valor.

Recuerda que los triggers se disparan por cada operacion de DML involucrada,
y no por cada fila, asi que ten en cuenta que el trigger sea disparado aunque
no se haya afectado ninguna fila.

Ejemplo:

use tempdb
go

create table dbo.t1 (
c1 int not null primary key
)
go

create trigger tr_t1_ins_upd_del on dbo.t1
for insert, update, delete
as

if @@rowcount = 0 return

if exists (select * from inserted) and not exists (select * from deleted)
print 'insert'

if exists (select * from inserted) and exists (select * from deleted)
print 'update'

if (not exists (select * from inserted)) and exists (select * from deleted)
print 'delete'
GO

insert into dbo.t1(c1) values(4)
go

update dbo.t1
set c1 = 17
where c1 = 4
go

delete dbo.t1
go

insert into dbo.t1(c1)
select 1 where 0 = 1
go

drop table dbo.t1
go


2 - Puedes usar "SET CONTEXT_INFO" para pasar informacion hacia el trigger,
e indicarle el tipo de operacion que se esta realizando en ese pedido
(request). Chequea los BOL para mas info sobre este metodo.


AMB


"Francizk0" wrote:

Q tal gente
Mi problema es que tengo un trigger para INSERT y UPDATE, pero mi duda
es q para la tabla q aplico el trigger exiet un campo [condicion] q
puede tomar valor de 0 o 1,
1. Si hago Insert
1.1 [condicion] = 0 no hace accion alguna
1.2 [condicion] = 1 realizo un proceso

2. Si hago un UpDate
2.1 [condicion] => de 0 a 1 Realizo el proceso
2.2 [condicion] => de 1 a 0 No Pasa este caso ( X )

Pero mi duda es como identifico si es un Insert o un Update.
PDT. Lo dividiria en dos trigger ( INSERT - UPDATE ) pero el problema
es q tb se acen otras procesos relacionados con este y otros campos de
mi tabla.
Lo q intento hacer es algo asi
SELECT @condicion = condicion FROM INSERTED
IF @condicion = 1
SELECT @condicion1 = condicion FROM DELETED
.aca es mi duda como identifico si estoi en un Insert o update?? ya
q el deleted solo lo puedo usar en UPDATE, como el proceso q realizo
son de insert me genera errores de PK ya existentes

Alguna Sugerencia

Preguntas similares