Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

duda con triggers y procedimientos almacenados

Estas en el tema de duda con triggers y procedimientos almacenados en el foro de SQL Server en Foros del Web. Hola monica,tengo una duda y te explico mi problema: estoy desarrollando un programa en C# y por ejemplo para la gestion de clientes quiero: a) ...
  #1 (permalink)  
Antiguo 29/11/2006, 07:57
 
Fecha de Ingreso: junio-2004
Ubicación: ORENSE
Mensajes: 258
Antigüedad: 19 años, 10 meses
Puntos: 0
duda con triggers y procedimientos almacenados

Hola monica,tengo una duda y te explico mi problema:
estoy desarrollando un programa en C# y por ejemplo para la gestion de clientes quiero:
a) almacenar el cliente en la base de datos sql server 2005 mediante un procedimiento almacenado.
b) para controlar que por ejemplo el dni del cliente que voy a introducir en la base de datos no este ya insertado,comprobarlo mediante un trigger y no mediante codigo en C# en el programa.

Con esto lo que quiero es que sea la base de datos la encargada de controlar esas restricciones,ademas de que se ejecutaran mas rapido.
Mi duda es la siguiente:
desde el programa en C# llamo al procedimiento almacenado que tiene el codigo para insertar un cliente,consecuentemente al intentar hacer la sentencia INSERT se disparara mi trigger donde controlo si el valor del dni ya existe en la base de datos,si no existe no hago nada y se termina de ejecutar el trigger y el procedimiento almacenado.pero si el dni ya existe tendria que devolver un error y hacer un rollback para que no se me almacenaran los datos no?
y ademas puedo devolver un valor desde un trigger?
como se podria resolver esto?
__________________
Inmuebles de Galicia:www.inmueblevirtual.net
Compartir piso en Galicia:www.inmueblevirtual.net/foro
  #2 (permalink)  
Antiguo 29/11/2006, 08:07
 
Fecha de Ingreso: octubre-2004
Mensajes: 14
Antigüedad: 19 años, 6 meses
Puntos: 0
pq no mejor haces la columna del dni UNIQUE? eso impediría q se inserten datos repetidos.
  #3 (permalink)  
Antiguo 29/11/2006, 08:18
 
Fecha de Ingreso: junio-2004
Ubicación: ORENSE
Mensajes: 258
Antigüedad: 19 años, 10 meses
Puntos: 0
Exclamación problema con trigger

Hola a todos,les explico:
Tengo el siguiente procedimiento almacenado para insertar un cliente

Código:
ALTER PROCEDURE dbo.AltaCliente
@Dni_Insertado char(9) OUT,
@Dni char(9),
@Nombre varchar(20),
@Apellido1 varchar(50),
@Apellido2 varchar(50),
@Direccion varchar(50),
@Telefono char(9),
@Movil char(9)
AS
INSERT INTO dbo.Cliente (Dni,Nombre,Apellido1,Apellido2,Direccion,Telefono,Movil) 
VALUES (@Dni,@Nombre,@Apellido1,@Apellido2,@Direccion,@Telefono,@Movil);

SELECT @Dni_Insertado=dni FROM dbo.Cliente WHERE dni=@Dni;
Y por otro lado este trigger que me comprueba que el dni del cliente que voy insertar no estea ya en la bbdd

Código:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER TRIGGER [trigger_AltaCliente] 
   ON  [dbo].[Cliente]
   FOR INSERT
AS 
Declare @num int

SELECT @num=COUNT(i.dni) FROM inserted i INNER JOIN dbo.Cliente c
ON c.dni = i.dni

if(@num = 1)
	begin
		ROLLBACK TRANSACTION
	end
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
    -- Insert statements for trigger here

END
Al llamar al procedimiento almacenado desde codigo C# se dispara el trigger y si no existe un dni igual en la bbdd inserta el cliente correctamente.El problema me viene cuando existe un dni igual en la bbdd entonces el trigger tendria que deshacer la accion con rollback,pero esto me da un error.Por que??
__________________
Inmuebles de Galicia:www.inmueblevirtual.net
Compartir piso en Galicia:www.inmueblevirtual.net/foro
  #4 (permalink)  
Antiguo 29/11/2006, 08:22
 
Fecha de Ingreso: junio-2004
Ubicación: ORENSE
Mensajes: 258
Antigüedad: 19 años, 10 meses
Puntos: 0
Ya la tengo unique pero ese error de qie si es igual lo quiero controlar con n trigger,y deshacer la accion con el rollback.
__________________
Inmuebles de Galicia:www.inmueblevirtual.net
Compartir piso en Galicia:www.inmueblevirtual.net/foro
  #5 (permalink)  
Antiguo 29/11/2006, 09:02
 
Fecha de Ingreso: octubre-2004
Mensajes: 14
Antigüedad: 19 años, 6 meses
Puntos: 0
ponle BEGIN TRANSACTION antes del select.

y tu if manéjalo asi

if(@num = 1)
ROLLBACK TRANSACTION
else
COMMIT
  #6 (permalink)  
Antiguo 30/11/2006, 10:56
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Pregunta, no sería mejor hacer que el campo dni sea llave, o un indice sin duplicados? y en el insert que haces en el SP har un:

IF NOT EXISTS(SELECT 1 FROM CLIENTE WHERE DNI = DNI) BEGIN
>>>>INSERT INTO CLIENTE (...)
>>>>VALUES(...)
END

Luego para evaluar la insercion no tienes que hacer un select a la tabla de CLIENTE

SELECT @Dni_Insertado=dni FROM dbo.Cliente WHERE dni=@Dni

esto es redundante no crees?

Saludos!
  #7 (permalink)  
Antiguo 30/11/2006, 10:57
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
jeje me faltó la @ saludos!

IF NOT EXISTS(SELECT 1 FROM CLIENTE WHERE DNI = @DNI) BEGIN
>>>>INSERT INTO CLIENTE (...)
>>>>VALUES(...)
END
  #8 (permalink)  
Antiguo 30/11/2006, 11:04
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
yo no recomiendo para nada los triggers..... es mejor hacer una validacion previa del insert

IF NOT EXISTS(SELECT 1 FROM CLIENTES WHER ....) BEGIN
>>>> .....
END

Saludos!
  #9 (permalink)  
Antiguo 30/11/2006, 15:32
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Así es, como ya te comentaron... Un UNIQUE INDEX sobre el campo de DNI evitará el código extra, ni siquiera necesitas que DNI sea tu campo clave.

Te recomiendo que explores por ese lado...
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #10 (permalink)  
Antiguo 18/12/2006, 06:45
 
Fecha de Ingreso: junio-2004
Ubicación: ORENSE
Mensajes: 258
Antigüedad: 19 años, 10 meses
Puntos: 0
Re: duda con triggers y procedimientos almacenados

Ok muchas gracias,el Dni ya lo tengo como clave y unique y he eliminado el trigger y compruebo la existencia con un EXISTS y me funciona corectamente.
__________________
Inmuebles de Galicia:www.inmueblevirtual.net
Compartir piso en Galicia:www.inmueblevirtual.net/foro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:14.