Trigger instead of insert...

02/04/2004 - 02:23 por luis_mtz | Informe spam
Saludos

Tengo el siguiente trigger...

CREATE TRIGGER trg_insert_movimiento ON movimiento INSTEAD
OF INSERT as
BEGIN
insert into movimiento (mov_fol,con_cla,con_des)
SELECT COALESCE((SELECT MAX(mov_fol) FROM
movimiento) +1, 1),con_cla,con_des FROM inserted
END

Bien esta es la estructura, se encuentran muchos mas
campos, solo que los omito para no hacerlo tan extenso, el
problema es que me envia error que mov_fol no puede ser
NULL. El insert se realiza desde un procedimiento
almacenado..

ALTER PROC dbo.pduinsertmovimiento
@concla int,
@condes varchar(50),
@lnid int OUTPUT AS
INSERT INTO dbo.movimiento
(con_cla, con_des)
VALUES (@concla, @condes)
SET @lnid=SCOPE_IDENTITY()


bien segun yo el trigger por ser instead la insercion real
se realiza en este, y aqui es donde se asigna valor al
campo mov_fol, alguien ve que estoy haciendo mal?

muchas gracias.

luis_mtz

Preguntas similare

Leer las respuestas

#6 Maximiliano D. A.
02/04/2004 - 20:43 | Informe spam
y ese 999 de donde lo sacas? no deberia ser un numero consecutivo? con el
Max etc? ahh porque lo mandabas en nulo eso!!! mmmm es extraño pero puede
ser por lo siguiente.

Antes de ejecutar el trigger lo que hace creo Sql es verificar la
integridad, o sea si un campo no va nulo lo voltea antes de que se ejecute
el trigger por eso es que te daba error :-D

Bue me alegro entonces che!! Suerte


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"luis_mtz" escribió en el mensaje
news:12f9a01c418e1$fcf57730$


Hola Max!

efectivamente el error estaba en el insert, esto me
llevo a modificar el procedimiento almacenado y quedo de
la siguiente forma..


ALTER PROC dbo.pduinsertmovimiento @concla int,@condes
varchar(50),@lnid int OUTPUT AS
INSERT INTO dbo.movimiento (mov_fol,con_cla, con_des)
VALUES(999,@concla, @condes)
SET @lnid=SCOPE_IDENTITY()


Le di un valor cualquiera en el procedimiento almacenado,
y en el trigger instead se agrega el valor que corresponde.
Es algo curioso, bien esta regla la tendre muy presente.

:))

gracias

luis_mtz


Mostrar la cita
no admite nulos y
Mostrar la cita
(, proba una cosa:
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
en el mensaje
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
09/03/2004
Mostrar la cita
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
#7 luis_mtz
02/04/2004 - 22:06 | Informe spam
hola max

bien esta explicacion suena logica ya que en el trigger
puse un insert a una tabla llamada "temporal" (como
prueba) y tampoco agregaba en esta, por lo que si es
posible que primero verifique la integridad, y por eso me
enviaba el error.. mira lo que dice en los BOL

"cualquier instrucción INSERT que haga referencia a una
vista debe suministrar un valor para la columna (hablan de
una NOT NULL). Este valor es necesario para generar la
tabla inserted pasada al desencadenador"

ahora que leo esto me digo "basico!", la tabla inserted
generada en el trigger debe cumplir las mismas reglas que
la tabla base.

saludos

luis_mtz




Mostrar la cita
consecutivo? con el
Mostrar la cita
extraño pero puede
Mostrar la cita
verificar la
Mostrar la cita
de que se ejecute
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
en el mensaje
Mostrar la cita
corresponde.
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
(mov_fol,con_cla,con_des)
Mostrar la cita
no
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
escribió
Mostrar la cita
extenso,
Mostrar la cita
ser
Mostrar la cita
(http://www.grisoft.com).
Mostrar la cita
09/03/2004
Mostrar la cita
#8 Javier Loria
03/04/2004 - 20:37 | Informe spam
Hola Luis:
Un par de comentarios a lo que ya tienes:
a) Usa un Default de valor invalido en la columna mov_fol. talvez:
DEFAULT -1
b) El Trigger esta disenado para 1 sola fila en el Inserted, si algien
inserta mas de una fila se asigna el mismo mov_fol para todos, o cambias la
logica del SELECT (probablemente ordenando por la llave primaria natural y
asignando un consecutivo) o preguntas si hay varios en INSERTED para
evitarlo con un ROLLBACK y un RAISERROR.
c) El SCOPE_IDENTITY() no te sirve para obtener el ultimo movimiento.
Tengo otras dudas, pero esas tres me parecen las de bulto.
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.

luis_mtz escribio:
Mostrar la cita
#9 luis_mtz
05/04/2004 - 22:01 | Informe spam
Hola Javier..

Mostrar la cita
mov_fol. talvez:
Mostrar la cita
listo tks!

Mostrar la cita
Inserted, si algien
Mostrar la cita
todos, o cambias la
Mostrar la cita
primaria natural y
Mostrar la cita
INSERTED para
Mostrar la cita
bueno segun yo en el insert del trigger, se asigno los
elementos de la tabla inserted.. no es asi para varias
filas?

Mostrar la cita
si ya me di cuenta... cambie a @@IDENTITY, me funciono,
pero me no estoy al 100% seguro...


Mostrar la cita
venga que son?


gracias.

luis_mtz






Mostrar la cita
mov_fol. talvez:
Mostrar la cita
Inserted, si algien
Mostrar la cita
todos, o cambias la
Mostrar la cita
primaria natural y
Mostrar la cita
INSERTED para
Mostrar la cita
ultimo movimiento.
Mostrar la cita
bulto.
Mostrar la cita
INSTEAD
Mostrar la cita
el
Mostrar la cita
real
Mostrar la cita
Ads by Google
Search Busqueda sugerida