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


Hola, el error esta en el Insert y seguro que ese campo


no admite nulos y
por eso chilla el loco :(

lo que me parece extraño es que no funque con el Isnull :


(, proba una cosa:

Saca eso fuera y fijate el select que te retorna

Bye


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:1759701c418c2$f2c64a60$


hola Max!

pues mira se me complico pk ya hice lo siguiente..
modifique como indicaste y lo mismo, cree una
tabla 'temporales' y lo puse asi en el TRIGGER..

CREATE TRIGGER trg_insert_movimiento ON dbo.movimiento
INSTEAD OF INSERT as
BEGIN
insert into temporales values (getdate(),"Desde
trigger")
insert into dbo.movimiento (mov_fol,con_cla,con_des)
SELECT (SELECT isnull(MAX(mov_fol),0) + 1
FROM dbo.movimiento),con_cla,con_des FROM inserted
END


y bien me envia el error que mov_fol no puede estar nulo,
y yo esperaba que al menos se insertara en 'temporales'
pero nada, temporales esta vacia despues de realizar.. no
tengo transacciones como para que me revierta el
insert.. ahora mi teoria es que por alguna razon no se
aplica el trigger instead, pero no veo mi error..

gracias.

luis_mtz


hola, lo que yo haria es poner un isnull en el Max y


ponerle 0 o sea si ese
MAx da nulo entonces pone un 0 o lo que fuere

insert into movimiento (mov_fol,con_cla,con_des)
SELECT (SELECT isnull(MAX(mov_fol),0) + 1 FROM
movimiento) ,con_cla,con_des FROM inserted

proba asi a ver que pacha y me decis :D

Bye



Salu2






-
-
Maximiliano Damian Accotto
Gerente de IT
Fundicion San Cayetano S.A.
Buenos Aires Argentina





-
maxi_accotto[arroba]speedy[.]com[.].ar
MSN:



"luis_mtz" escribió


en el mensaje
news:176d601c41848$ab6918c0$

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





.






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


.






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
Respuesta Responder a este mensaje
#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




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


Hola, el error esta en el Insert y seguro que ese campo


no admite nulos y
por eso chilla el loco :(

lo que me parece extraño es que no funque con el Isnull :


(, proba una cosa:

Saca eso fuera y fijate el select que te retorna

Bye


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:1759701c418c2$f2c64a60$


hola Max!

pues mira se me complico pk ya hice lo siguiente..
modifique como indicaste y lo mismo, cree una
tabla 'temporales' y lo puse asi en el TRIGGER..

CREATE TRIGGER trg_insert_movimiento ON dbo.movimiento
INSTEAD OF INSERT as
BEGIN
insert into temporales values (getdate(),"Desde
trigger")
insert into dbo.movimiento




(mov_fol,con_cla,con_des)
SELECT (SELECT isnull(MAX(mov_fol),0) + 1
FROM dbo.movimiento),con_cla,con_des FROM inserted
END


y bien me envia el error que mov_fol no puede estar nulo,
y yo esperaba que al menos se insertara en 'temporales'
pero nada, temporales esta vacia despues de realizar..




no
tengo transacciones como para que me revierta el
insert.. ahora mi teoria es que por alguna razon no se
aplica el trigger instead, pero no veo mi error..

gracias.

luis_mtz


hola, lo que yo haria es poner un isnull en el Max y


ponerle 0 o sea si ese
MAx da nulo entonces pone un 0 o lo que fuere

insert into movimiento (mov_fol,con_cla,con_des)
SELECT (SELECT isnull(MAX(mov_fol),0) + 1 FROM
movimiento) ,con_cla,con_des FROM inserted

proba asi a ver que pacha y me decis :D

Bye



Salu2







-
-
-
Maximiliano Damian Accotto
Gerente de IT
Fundicion San Cayetano S.A.
Buenos Aires Argentina






-
-
maxi_accotto[arroba]speedy[.]com[.].ar
MSN:






-


"luis_mtz"






escribió
en el mensaje
news:176d601c41848$ab6918c0$

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





.






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


.






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


.

Respuesta Responder a este mensaje
#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:
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
Respuesta Responder a este mensaje
#9 luis_mtz
05/04/2004 - 22:01 | Informe spam
Hola Javier..

a) Usa un Default de valor invalido en la columna


mov_fol. talvez:
DEFAULT -1



listo tks!

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.



bueno segun yo en el insert del trigger, se asigno los
elementos de la tabla inserted.. no es asi para varias
filas?

c) El SCOPE_IDENTITY() no te sirve para obtener el
ultimo movimiento.



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


Tengo otras dudas, pero esas tres me parecen las de
bulto.



venga que son?


gracias.

luis_mtz






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:
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




.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida