Pregunta Triggers

30/11/2004 - 19:03 por Richard Padilla | Informe spam
Hola as todos

tengo tres trigger

TRIGGER TGGPSPCPINSERT
TRIGGER TGGPSPCPUPDATE
TRIGGER TGGPSPCPDELETE

Por cada sentencia SQL el trigger hace diferentes cosas, la pregunta es la
siguiente: ¿ puedo yo unificar los 3 triggers en uno solo y ponerle algo así
como un CASE para el INSERT, un Case para el UPDATE y un CASE para el
DELETE.

Me pueden colaborar con algun ejemplo por favor?



CREATE TRIGGER TGGPSPCPINSERT
ON IV00101
FOR INSERT
AS
-
-
If @@Rowcount = 0
Return
-
alguna manera
-
IF UPDATE (ITEMNMBR) OR UPDATE (ITEMDESC)
BEGIN

IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR ((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS') OR
((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR ((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')

BEGIN
-
-

INSERT INTO TBLTEMPORALGPSPCP (CODI_MATE_GRUPO, CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA, NOMB_MATE_REFERENCIA,
TIPO_MOVIMIENTO)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS CODI_MATE_GRUPO,
SUBSTRING(Ins.ITEMNMBR, 3, 2) AS CODI_MATE_SUBGRUPO,
B.UOMSCHDL AS CODI_UNID_MEDI_PLAN, C.UOFM AS CODI_UNID_MEDIDA,
Ins.ITEMNMBR AS CODI_MATE_REFERENCIA,
Ins.ITEMDESC AS NOMB_MATE_REFERENCIA, '0' AS TIPO_MOVIMIENTO
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD = '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR (D.ITMCLSCD = '4_INS.
TER')

-
datos
-

INSERT INTO TBLAUDITORIAGPSPCP (CODI_MATE_GRUPO, CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA, NOMB_MATE_REFERENCIA, ITMCLSCD,
ITMCLSDC, TIPO_MOVIMIENTO, ESTADO, FECHA)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS
CODI_MATE_GRUPO,SUBSTRING(Ins.ITEMNMBR, 3, 2)
AS CODI_MATE_SUBGRUPO, B.UOMSCHDL AS CODI_UNID_MEDI_PLAN, C.UOFM AS
CODI_UNID_MEDIDA, Ins.ITEMNMBR AS CODI_MATE_REFERENCIA, Ins.ITEMDESC AS
NOMB_MATE_REFERENCIA, D.ITMCLSCD, D.ITMCLSDC, 'INSERSIÓN' AS
TIPO_MOVIMIENTO, 'COPIADO'
AS ESTADO, GETDATE() AS FECHA
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD = '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR (D.ITMCLSCD = '4_INS.
TER')


-
-
IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR ((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name = 'JOBGPSPCPMATERIASPRIMAS'
END

IF ((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR ((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name = 'JOBGPSPCPINSUMOS'
END

END

END

GO

Preguntas similare

Leer las respuestas

#1 ulises
30/11/2004 - 20:23 | Informe spam
Si como mencionas los tres triggers hacen cosas diferentes
no veo ganancia en juntarlos, lo único que lograrías es
volver el código menos legible.

Saludos,
Ulises

Hola as todos

tengo tres trigger

TRIGGER TGGPSPCPINSERT
TRIGGER TGGPSPCPUPDATE
TRIGGER TGGPSPCPDELETE

Por cada sentencia SQL el trigger hace diferentes cosas,


la pregunta es la
siguiente: ¿ puedo yo unificar los 3 triggers en uno solo


y ponerle algo así
como un CASE para el INSERT, un Case para el UPDATE y un


CASE para el
DELETE.

Me pueden colaborar con algun ejemplo por favor?



CREATE TRIGGER TGGPSPCPINSERT
ON IV00101
FOR INSERT
AS
-
-
If @@Rowcount = 0
Return
-


modificados de
alguna manera
-
IF UPDATE (ITEMNMBR) OR UPDATE (ITEMDESC)
BEGIN

IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR


((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS') OR
((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR


((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')

BEGIN
-
-

INSERT INTO TBLTEMPORALGPSPCP (CODI_MATE_GRUPO,


CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA,


NOMB_MATE_REFERENCIA,
TIPO_MOVIMIENTO)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS CODI_MATE_GRUPO,
SUBSTRING(Ins.ITEMNMBR, 3, 2) AS CODI_MATE_SUBGRUPO,
B.UOMSCHDL AS CODI_UNID_MEDI_PLAN, C.UOFM AS


CODI_UNID_MEDIDA,
Ins.ITEMNMBR AS CODI_MATE_REFERENCIA,
Ins.ITEMDESC AS NOMB_MATE_REFERENCIA, '0' AS TIPO_MOVIMIENTO
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR


(D.ITMCLSCD = '4_INS.
TER')

-


de la copia de
datos
-

INSERT INTO TBLAUDITORIAGPSPCP (CODI_MATE_GRUPO,


CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA,


NOMB_MATE_REFERENCIA, ITMCLSCD,
ITMCLSDC, TIPO_MOVIMIENTO, ESTADO, FECHA)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS
CODI_MATE_GRUPO,SUBSTRING(Ins.ITEMNMBR, 3, 2)
AS CODI_MATE_SUBGRUPO, B.UOMSCHDL AS


CODI_UNID_MEDI_PLAN, C.UOFM AS
CODI_UNID_MEDIDA, Ins.ITEMNMBR AS CODI_MATE_REFERENCIA,


Ins.ITEMDESC AS
NOMB_MATE_REFERENCIA, D.ITMCLSCD, D.ITMCLSDC,


'INSERSIÓN' AS
TIPO_MOVIMIENTO, 'COPIADO'
AS ESTADO, GETDATE() AS FECHA
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR


(D.ITMCLSCD = '4_INS.
TER')


-


package DTS
-
IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR


((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name 'JOBGPSPCPMATERIASPRIMAS'
END

IF ((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR


((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name = 'JOBGPSPCPINSUMOS'
END

END

END

GO



.

Respuesta Responder a este mensaje
#2 Javier Loria
01/12/2004 - 00:15 | Informe spam
Hola:
Aparte del valioso comentario de Ulises.
El trigger tiene algunos problemas. El mas importante es que asume que
hay una sola fila en la tabla de Inserted. Por ejemplo: (SELECT ITMCLSCD
FROM Inserted) = '1_MP FORRO' que ocurriria si vienen multiples filas?


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Richard Padilla" wrote in message
news:
Hola as todos

tengo tres trigger

TRIGGER TGGPSPCPINSERT
TRIGGER TGGPSPCPUPDATE
TRIGGER TGGPSPCPDELETE

Por cada sentencia SQL el trigger hace diferentes cosas, la pregunta es la
siguiente: ¿ puedo yo unificar los 3 triggers en uno solo y ponerle algo


así
como un CASE para el INSERT, un Case para el UPDATE y un CASE para el
DELETE.

Me pueden colaborar con algun ejemplo por favor?



CREATE TRIGGER TGGPSPCPINSERT
ON IV00101
FOR INSERT
AS
If @@Rowcount = 0
Return
alguna manera
IF UPDATE (ITEMNMBR) OR UPDATE (ITEMDESC)
BEGIN

IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR ((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS') OR
((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR ((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')

BEGIN

INSERT INTO TBLTEMPORALGPSPCP (CODI_MATE_GRUPO, CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA, NOMB_MATE_REFERENCIA,
TIPO_MOVIMIENTO)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS CODI_MATE_GRUPO,
SUBSTRING(Ins.ITEMNMBR, 3, 2) AS CODI_MATE_SUBGRUPO,
B.UOMSCHDL AS CODI_UNID_MEDI_PLAN, C.UOFM AS CODI_UNID_MEDIDA,
Ins.ITEMNMBR AS CODI_MATE_REFERENCIA,
Ins.ITEMDESC AS NOMB_MATE_REFERENCIA, '0' AS TIPO_MOVIMIENTO
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD = '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR (D.ITMCLSCD = '4_INS.
TER')

datos

INSERT INTO TBLAUDITORIAGPSPCP (CODI_MATE_GRUPO, CODI_MATE_SUBGRUPO,
CODI_UNID_MEDI_PLAN,
CODI_UNID_MEDIDA, CODI_MATE_REFERENCIA, NOMB_MATE_REFERENCIA, ITMCLSCD,
ITMCLSDC, TIPO_MOVIMIENTO, ESTADO, FECHA)
SELECT SUBSTRING(Ins.ITEMNMBR, 1, 2) AS
CODI_MATE_GRUPO,SUBSTRING(Ins.ITEMNMBR, 3, 2)
AS CODI_MATE_SUBGRUPO, B.UOMSCHDL AS CODI_UNID_MEDI_PLAN, C.UOFM AS
CODI_UNID_MEDIDA, Ins.ITEMNMBR AS CODI_MATE_REFERENCIA, Ins.ITEMDESC AS
NOMB_MATE_REFERENCIA, D.ITMCLSCD, D.ITMCLSDC, 'INSERSIÓN' AS
TIPO_MOVIMIENTO, 'COPIADO'
AS ESTADO, GETDATE() AS FECHA
FROM Inserted Ins INNER JOIN IV40201 B
ON Ins.UOMSCHDL = B.UOMSCHDL INNER JOIN IV40202 C ON
Ins.UOMSCHDL = C.UOMSCHDL INNER JOIN
IV40400 D ON Ins.ITMCLSCD = D.ITMCLSCD
WHERE (D.ITMCLSCD = '1_MP FORRO') OR (D.ITMCLSCD = '1_MP TELAS') OR
(D.ITMCLSCD = '4_INS. FAB') OR (D.ITMCLSCD = '4_INS.
TER')


IF ((SELECT ITMCLSCD FROM Inserted) = '1_MP FORRO') OR ((SELECT ITMCLSCD
FROM Inserted) = '1_MP TELAS')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name = 'JOBGPSPCPMATERIASPRIMAS'
END

IF ((SELECT ITMCLSCD FROM Inserted) = '4_INS. FAB') OR ((SELECT ITMCLSCD
FROM Inserted) = '4_INS. TER')
BEGIN
EXEC msdb.dbo.sp_start_job @job_name = 'JOBGPSPCPINSUMOS'
END

END

END

GO



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