Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/04/2011, 12:59
sterlingdiazd
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Trigger impide que inserte más de 1 fila a una tabla

Para hacer preguntas especificas cree este nuevo tema. La pregunta es porque el trigger creado...

Cita:
CREATE TRIGGER id_cliente ON Prestamos FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
declare @monto_aprobado int
select @monto_aprobado = prestamos.monto_aprobado from prestamos
IF (@monto_aprobado > (select limite_credito from cliente, prestamos where cliente.id_cliente = prestamos.id_cliente))
begin
raiserror ('No tiene suficiente crédito para tomar este prestamo.', 16,1)
rollback transaction
end
END
Solo permite que se inserte...

Cita:
insert into prestamos (id_cliente,fecha_solicitud,monto_solicitado,fecha _desembolso,monto_aprobado,balance,tipo_credito,pl azo,dia_pago)
values ('001','01/042011',900,'01/4/2011',500,0,'CONSUMO','3','01/0/2011')
una sola fila. Es decir, el trigger inpide que en el monto aprobado (valor subrayado) sea mayor que el limite de credito de otra tabla cliente, la cual tiene 50000 como valor de limite de credito.

Si en la insercion introduzco un valor menor a los 50 mil, insercion ocurre bien, pero si intento ingresar otra fila con un valor tambien menor a los 50 mil, usando el mismo script para insertar, solo que modificando el valor, me da el siguiente error:

Cita:
Mens 512, Nivel 16, Estado 1, Procedimiento id_cliente, Línea 7
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
Se terminó la instrucción.
Para que el nuevo valor que intento introducir, se logre insertar, tengo que borrar la fila ya insertada en la tabla e intentar de nuevo ingresar el nuevo valor. Ahi se inserta sin ningun problema. El caso es que solo me permite insertar una sola fila en la tabla. Si intento, por ejemplo, cambiando el valor de monto aprobado, poniendolo por encima del limite que le trigger permite, el cual es 50 mil, entonces me da el mismo error, en vez de darme el error que el trigger especifica que debe dar.

Pero si borro la fila que ya esta, e intento nuevamente con el valor que excede los 50 mil, ahi si me da el mensaje que el trigger tiene programado para dar.

Si alguien quiere probar, les dejo aqui los datos necesarios:

Cita:
CREATE TABLE CLIENTE (
id_cliente nvarchar(100) primary key,
nombre nvarchar (100),
apellido nvarchar (100),
direccion nvarchar (100),
tel_celular nvarchar (100),
tel_casa nvarchar (100),
tel_oficina nvarchar (100),
limite_credito int)
--Poblar la Tabla Cliente

Cita:
insert into cliente values ('001','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
insert into cliente values ('002','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
insert into cliente values ('003','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
insert into cliente values ('004','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
insert into cliente values ('005','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
insert into cliente values ('006','Sterling', 'Diaz', 'C/Mantesa A. #2','829-592-0579','809-537-3930','N/A',50000)
--Tabla prestamos

Cita:
CREATE TABLE PRESTAMOS (
id_cliente nvarchar(100) FOREIGN KEY REFERENCES cliente (id_cliente),
num_prestamo int IDENTITY PRIMARY KEY,
fecha_solicitud nvarchar (100),
monto_solicitado int,
fecha_desembolso nvarchar (100),
monto_aprobado int,
balance int,
tipo_credito nvarchar (100) check (tipo_credito in ('CONSUMO','COMERCIAL','HIPOTECARIO')),
plazo nvarchar (100),
dia_pago nvarchar (100))
--Trigger

Cita:
CREATE TRIGGER id_cliente ON Prestamos FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
declare @monto_aprobado int
select @monto_aprobado = prestamos.monto_aprobado from prestamos
IF (@monto_aprobado > (select limite_credito from cliente, prestamos where cliente.id_cliente = prestamos.id_cliente))
begin
raiserror ('No tiene suficiente crédito para tomar este prestamo.', 16,1)
rollback transaction
end
END
-- Ingresar filas en la Tabla prestamos

Cita:
insert into prestamos (id_cliente,fecha_solicitud,monto_solicitado,fecha _desembolso,monto_aprobado,balance,tipo_credito,pl azo,dia_pago) values ('001','01/042011',900,'01/4/2011',5000,0,'CONSUMO','3','01/0/2011')

insert into prestamos (id_cliente,fecha_solicitud,monto_solicitado,fecha _desembolso,monto_aprobado,balance,tipo_credito,pl azo,dia_pago) values ('002','01042011',900,'01//2011',500,0,'CONSUMO','3','01/02011')
Gracias por su cooperacion!