Saber si un trigger es insert o delete o update

12/03/2008 - 17:50 por naimps | Informe spam
Buenas.

He creado un trigger para insert, delete y update, pero necesito saber
cuándo se lanza por un delete.

¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
inserted?

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
12/03/2008 - 18:04 | Informe spam
Durante la ejecución del trigger, la función EVENTDATA responde un XML que
contiene información, entre otras cosas, de cuál fue la acción disparadora
(INSERT, DELETE o UPDATE).

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"naimps" wrote:

Buenas.

He creado un trigger para insert, delete y update, pero necesito saber
cuándo se lanza por un delete.

¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
inserted?

Muchas gracias.



Respuesta Responder a este mensaje
#2 Alejandro Mesa
13/03/2008 - 20:12 | Informe spam
Gux,

Puedo estar equivocado, pero creo que esta función no es util dentro de los
triggers disparados por sentencias DML como insert, update o delete a nivel
de tabla. Es util para eventos a nivel de servidor o base de datos, como los
triggers de DDL o logon.

USE tempdb
GO

CREATE TABLE dbo.t1 (
c1 INT
)
GO

CREATE TRIGGER tr_t1_del ON dbo.t1
FOR DELETE
AS
SELECT EVENTDATA().value
('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO

DELETE dbo.t1
GO

DROP TABLE dbo.t1
GO


AMB

"Gux (MVP)" wrote:

Durante la ejecución del trigger, la función EVENTDATA responde un XML que
contiene información, entre otras cosas, de cuál fue la acción disparadora
(INSERT, DELETE o UPDATE).

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"naimps" wrote:

> Buenas.
>
> He creado un trigger para insert, delete y update, pero necesito saber
> cuándo se lanza por un delete.
>
> ¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
> inserted?
>
> Muchas gracias.
>
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
13/03/2008 - 20:49 | Informe spam
naimps,

Pudieras chequear las tablas INSERTED Y DELETED.

INSERT -> DELETED 0 rows - INSERTED n filas
DELETE -> DELETED n rows - INSERTED 0 filas
UPDATE -> DELETED e INSERTED n filas

Recuerda que los triggers son disparado por la sentencia y no por las filas
afectadas por la sentencia, por lo que tu trigger debe tener en cuenta cuando
ninguna fila fue afectada. Para controlar el flujo de el codigo en el
trigger, puedes usar el valor de @@ROWCOUNT.

USE tempdb
GO

CREATE TABLE dbo.t1 (
c1 INT
)
GO

CREATE TRIGGER tr_t1_ins_upd_del ON dbo.t1
FOR INSERT, UPDATE, DELETE
AS
SET NOCOUNT ON
SELECT
(SELECT COUNT(*) FROM deleted) AS [DELETED] ,
(SELECT COUNT(*) FROM inserted) AS [INSERTED]
GO

INSERT INTO dbo.t1(c1)
SELECT 1 WHERE 0 = 1
GO

UPDATE dbo.t1
SET c1 = 10
WHERE c1 = 7
GO

DELETE dbo.t1
GO

ALTER TRIGGER tr_t1_ins_upd_del ON dbo.t1
FOR INSERT, UPDATE, DELETE
AS
IF @@ROWCOUNT = 0 RETURN

SET NOCOUNT ON

SELECT
(SELECT COUNT(*) FROM deleted) AS [DELETED] ,
(SELECT COUNT(*) FROM inserted) AS [INSERTED]
GO

INSERT INTO dbo.t1(c1)
SELECT 1 WHERE 0 = 1
GO

UPDATE dbo.t1
SET c1 = 10
WHERE c1 = 7
GO

DELETE dbo.t1
GO

INSERT INTO dbo.t1(c1)
SELECT 1 WHERE 1 = 1
GO

UPDATE dbo.t1
SET c1 = 4
WHERE c1 = 1
GO

DELETE dbo.t1
GO

DROP TABLE dbo.t1
GO

No es buena practica usar sentencias "select" dentro de un trigger para
retornar informacion a al aplicacion cliente. Lo hice solo para mostrar lo
explicado.

AMB


"naimps" wrote:

Buenas.

He creado un trigger para insert, delete y update, pero necesito saber
cuándo se lanza por un delete.

¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
inserted?

Muchas gracias.



Respuesta Responder a este mensaje
#4 Alf Sebastian
17/03/2008 - 02:31 | Informe spam
On 12 mar, 10:50, "naimps" wrote:
Buenas.

He creado un trigger para insert, delete y update, pero necesito saber
cuándo se lanza por un delete.

¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
inserted?

Muchas gracias.



Hola
te envio un trigger que estoy utilizando en mi aplicación yo golive
sin problema alguno

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER Trigger
[RESTAAPARTADOS_DINCACODIGOMARCA_DINCACODIGOMARCAALMACEN]
On [SIMA].[dbo].[DINTCMSOLICITUD]
AFTER DELETE
As

Declare @vCODIGOMARCA as char(20)
Declare @vALMACEN as int
Declare @vSCANTIDADSOLICITADA as bigint

BEGIN TRANSACTION
if exists(Select CODIGOMARCA From Deleted )
begin
Select @vCODIGOMARCA = (Select CODIGOMARCA From Deleted )
Select @vALMACEN = (Select ALMACEN From Deleted)
Select @vSCANTIDADSOLICITADA = (Select SCANTIDADSOLICITADA From
Deleted )

if @vALMACEN = 1
begin
EXEC STP_DINCACODIGOMARCA_APR
@vCODIGOMARCA,@vSCANTIDADSOLICITADA


EXEC STP_DINCACODIGOMARCAALMACEN_APR
@vALMACEN,@vCODIGOMARCA,@vSCANTIDADSOLICITADA

end
end

IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
ROLLBACK
Respuesta Responder a este mensaje
#5 Gux (MVP)
17/03/2008 - 22:29 | Informe spam
Buen punto Alejandro.

EVENTDATA retorna datos si se usa en triggers de DDL o de logon. En otras
llamadas, incluso desde rutinas llamadas desde el trigger, retorna nulo.

Gracias por la corrección.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Alejandro Mesa" wrote:

Gux,

Puedo estar equivocado, pero creo que esta función no es util dentro de los
triggers disparados por sentencias DML como insert, update o delete a nivel
de tabla. Es util para eventos a nivel de servidor o base de datos, como los
triggers de DDL o logon.

USE tempdb
GO

CREATE TABLE dbo.t1 (
c1 INT
)
GO

CREATE TRIGGER tr_t1_del ON dbo.t1
FOR DELETE
AS
SELECT EVENTDATA().value
('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO

DELETE dbo.t1
GO

DROP TABLE dbo.t1
GO


AMB

"Gux (MVP)" wrote:

> Durante la ejecución del trigger, la función EVENTDATA responde un XML que
> contiene información, entre otras cosas, de cuál fue la acción disparadora
> (INSERT, DELETE o UPDATE).
>
> Gustavo Larriera, Microsoft MVP
> https://mvp.support.microsoft.com/profile/gux
> Este mensaje se proporciona tal como es, sin garantías de ninguna clase.
>
>
>
> "naimps" wrote:
>
> > Buenas.
> >
> > He creado un trigger para insert, delete y update, pero necesito saber
> > cuándo se lanza por un delete.
> >
> > ¿Hay alguna forma de saberlo sin tener que comparar las tablas deleted e
> > inserted?
> >
> > Muchas gracias.
> >
> >
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida