Mas preguntas sobre triggers

17/06/2004 - 19:14 por Leonardo Azpurua | Informe spam
Peleando con el trigger que inclui en un mensaje hace un momento, me di
cuenta de que llamar a RAISERROR no detiene la ejecución del procedimiento
(ni producen una excepcion en VB.Net).

Puede tener algo que ver con el Nivel del error.

¿Cual es el mecanismo correcto para que bajo determinada circunstancia el
trigger aborte y se devuelva un estatus de error a la aplicación cliente?

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org

Preguntas similare

Leer las respuestas

#1 Fernando España
17/06/2004 - 19:45 | Informe spam
U na pequeña idea de como controlarlo





/* Delete Trigger 'T_D_tbl_propiedades_productos' for Table
'tbl_propiedades_productos' */

CREATE TRIGGER T_D_tbl_propiedades_productos ON tbl_propiedades_productos
FOR DELETE AS

BEGIN
DECLARE
@row_count INT,
@error_number INT,
@error_message VARCHAR(255)

SELECT @row_count = @@rowcount
IF @row_count = 0
RETURN

/* No se pueden eliminar propiedades de productos si ya tiene Familias
Asignadas*/

IF EXISTS (
SELECT 1
FROM tbl_propiedades_por_familia c, deleted d
WHERE c.id_empresa = d.id_empresa AND
c.id_propiedad = d.id_propiedad
)
BEGIN
SELECT @error_number0005,
@error_message='Existen detalles en propiedades por familia
de productos, no puede eliminar esta propiedad'
GOTO error
END
RETURN

/* Error Handling */
error:
RAISERROR @error_number @error_message
ROLLBACK TRANSACTION
END
go





Fernando España
Gerente Informatica
Alta Tecnologia en Informatica S.A.
www.atisa.com.gt
7a. calle 4-34 Zona 10
Guatemala Centro America
PBX: (502) 3620005

Email:

****************************************

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:
Peleando con el trigger que inclui en un mensaje hace un momento, me di
cuenta de que llamar a RAISERROR no detiene la ejecución del procedimiento
(ni producen una excepcion en VB.Net).

Puede tener algo que ver con el Nivel del error.

¿Cual es el mecanismo correcto para que bajo determinada circunstancia el
trigger aborte y se devuelva un estatus de error a la aplicación cliente?

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org


Respuesta Responder a este mensaje
#2 Javier Loria
17/06/2004 - 21:12 | Informe spam
Hola Leonardo:
Puedes probar un un viejo ejemplo:
/* Inicio de Codigo */
CREATE TABLE PruebaTrigger(
Id INT NOT NULL PRIMARY KEY
)
GO

CREATE TRIGGER InsPruebaTrigger
ON PruebaTrigger
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=1)
BEGIN
RAISERROR ('ID 1 NO es Permitido', 16, 10)
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=2)
BEGIN
ROLLBACK
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=3)
BEGIN
ROLLBACK
RAISERROR ('ID 3 NO es Permitido', 16, 10)
END
IF EXISTS (SELECT ID FROM INSERTED WHERE Id=4)
BEGIN
ROLLBACK
INSERT PruebaTrigger
VALUES (100)
END
END
GO

BEGIN TRAN
INSERT PruebaTrigger
VALUES (1)
INSERT PruebaTrigger
VALUES (11)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO
BEGIN TRAN
INSERT PruebaTrigger
VALUES (2)
INSERT PruebaTrigger
VALUES (12)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO
BEGIN TRAN
INSERT PruebaTrigger
VALUES (3)
INSERT PruebaTrigger
VALUES (13)
COMMIT
GO
SELECT * FROM PruebaTrigger
GO

BEGIN TRAN
INSERT PruebaTrigger
VALUES (4)
INSERT PruebaTrigger
VALUES (14)
COMMIT
SELECT * FROM PruebaTrigger

/* Fin de Codigo */
Espero te sirva para aclarar el papel que juegan ROLLBACK Y RAISERROR.
Saludos,


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.



Leonardo Azpurua <l e o n a r d o (arroba) m v p s (punto) o r g> escribio:
Peleando con el trigger que inclui en un mensaje hace un momento, me
di cuenta de que llamar a RAISERROR no detiene la ejecución del
procedimiento (ni producen una excepcion en VB.Net).

Puede tener algo que ver con el Nivel del error.

¿Cual es el mecanismo correcto para que bajo determinada
circunstancia el trigger aborte y se devuelva un estatus de error a
la aplicación cliente?
Respuesta Responder a este mensaje
#3 Norman A. Armas
17/06/2004 - 22:10 | Informe spam
Puedes usar los INSTEAD OF TRIGGERS
(busca en los BOL por ellos)

Saludos,

Norman
Maicrosoft LVP/MOP Certified



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> wrote in
message news:
Peleando con el trigger que inclui en un mensaje hace un momento, me di
cuenta de que llamar a RAISERROR no detiene la ejecución del procedimiento
(ni producen una excepcion en VB.Net).

Puede tener algo que ver con el Nivel del error.

¿Cual es el mecanismo correcto para que bajo determinada circunstancia el
trigger aborte y se devuelva un estatus de error a la aplicación cliente?

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org


Respuesta Responder a este mensaje
#4 Leonardo Azpurua
17/06/2004 - 22:11 | Informe spam
Muchas gracias!

"Javier Loria" escribió en el mensaje
news:%
Hola Leonardo:
Puedes probar un un viejo ejemplo:
Respuesta Responder a este mensaje
#5 Leonardo Azpurua
17/06/2004 - 23:34 | Informe spam
"Norman A. Armas" escribió en el mensaje
news:%
Puedes usar los INSTEAD OF TRIGGERS
(busca en los BOL por ellos)



Hola, Norman!

Ando mas enredado que perro con tres bolas, como decimos aquí (nunca he
entendido qué significa). Estoy nuevo con .Net y nuevo con SQL Server.

Al final descubrí cuatro cosas elementales:

1) Los errores con severity 16 y superior pasan a la aplicación.
2) Las transacciones iniciadas desde la aplicación están vigentes para las
operaciones realizadas dentro de los triggers y sps.
3) Se sale de las funciones con RETURN (ni eso lo sabia).

Con estas tres ya puedo irme defendiendo.

4) TENGO QUE LEERME LOS BOL

Siempre es agradable saber de ti.

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida