Trigger D insert ke modifica un campo D INSERTED
*** Tengo una tabla "Color" con solo dos campos "idColor" y "Nombre". El campo idColor es la llave y por lo tanto no permite nulos.
*** Tengo un stored procedure "sp_Folio" que genera el numero del id para la tabla que se le indique (en este caso Color).
*** Genere un triger para insert en la tabla color
CREATE TRIGGER ti_Color ON dbo.Color
FOR INSERT AS
begin
DECLARE @nf int
EXECUTE SP_GeneraFolio 'Color', @nf OUTPUT
UPDATE dbo.Color SET idColor = @nf WHERE idColor IS NULL
end
*** La idea es que al insertar solo se especifique el campo Nombre (INSERT INTO Color (Nombre) VALUES ('Azul') ).
*** El problema es que la base de datos me devuelve un error indicando que el campo idColor no puede recibir nulos y no se realiza la inserci贸n.
Este es el mensaje
Servidor: mensaje 515, nivel 16, estado 2, l铆nea 1
No se puede insertar el valor NULL en la columna 'idColor', tabla 'Catalogos.dbo.Color'. La columna no admite valores NULL. INSERT falla.
Se termin贸 la instrucci贸n.
Intente modificar el objeto INSERTED pero recibo un manseja indicando que no se puede actualizar por ser un objeto l贸gico.
Alguna idea para corregir esto. De antemano gracias.
*** Tengo un stored procedure "sp_Folio" que genera el numero del id para la tabla que se le indique (en este caso Color).
*** Genere un triger para insert en la tabla color
CREATE TRIGGER ti_Color ON dbo.Color
FOR INSERT AS
begin
DECLARE @nf int
EXECUTE SP_GeneraFolio 'Color', @nf OUTPUT
UPDATE dbo.Color SET idColor = @nf WHERE idColor IS NULL
end
*** La idea es que al insertar solo se especifique el campo Nombre (INSERT INTO Color (Nombre) VALUES ('Azul') ).
*** El problema es que la base de datos me devuelve un error indicando que el campo idColor no puede recibir nulos y no se realiza la inserci贸n.
Este es el mensaje
Servidor: mensaje 515, nivel 16, estado 2, l铆nea 1
No se puede insertar el valor NULL en la columna 'idColor', tabla 'Catalogos.dbo.Color'. La columna no admite valores NULL. INSERT falla.
Se termin贸 la instrucci贸n.
Intente modificar el objeto INSERTED pero recibo un manseja indicando que no se puede actualizar por ser un objeto l贸gico.
Alguna idea para corregir esto. De antemano gracias.
Bueno tu trigger tiene Incoherencias.
La primera es que defines una tabla color en la cual su PK esta formado por un campo que no insertaras
1) eso origina que te marque el error
2) si tu pk no puede haceptar null porque quieres
acualizar en tu trigger un campo que es null siendo este el PK
Si quieres insertar un solo dato que sea la descripcion de del color te pido que definas
un defaul al pk
y en tu trigger preguntes por el valor del defaul
el problema es que solo te funcionara para un inser y no para un conjunto de datos.
Espero que te funcione
si tienes alguna duda mandame un correo
A mi se me hace que mas bien no te quedo claro.
La idea es que el programador no tenga la necesidad de preocuparse por el campo llave, que en este caso corresponde a un campo numerico, que se debe autoincrementar. Aclaro que no quiero usar un campo identity y que por eso ejecuto el stored procedure que genera un folio para el campo idColor.
En mi mensaje pongo el ejemplo con la tabla Color pero aplica para toda tabla que requiera de un folio.
Ahora, de acuerdo a la explicaci贸n anterior del StoredProc, el que el programador/usuario no indique el id del color que desea agregar a la tabla no quiere decir que no se va a insertar en la misma. Se debe de insertar pero no por parte del programador/usuario.
Efectivamente el campo de la llave trae null al momento de la insercion y es precisamente por ello que lo quiero cambiar en el trigger y esto es lo que pregunte si se podia hacer y como.
Lo del valor por default en el campo me sono mas coherente.
Gracias y saludos
La idea es que el programador no tenga la necesidad de preocuparse por el campo llave, que en este caso corresponde a un campo numerico, que se debe autoincrementar. Aclaro que no quiero usar un campo identity y que por eso ejecuto el stored procedure que genera un folio para el campo idColor.
En mi mensaje pongo el ejemplo con la tabla Color pero aplica para toda tabla que requiera de un folio.
Ahora, de acuerdo a la explicaci贸n anterior del StoredProc, el que el programador/usuario no indique el id del color que desea agregar a la tabla no quiere decir que no se va a insertar en la misma. Se debe de insertar pero no por parte del programador/usuario.
Efectivamente el campo de la llave trae null al momento de la insercion y es precisamente por ello que lo quiero cambiar en el trigger y esto es lo que pregunte si se podia hacer y como.
Lo del valor por default en el campo me sono mas coherente.
Gracias y saludos
El problema con el trigger consiste en que se activa cuando ya se realizo el insert por eso marca el error de que no puede insertar valores nulos
lo del valor default es para que se inserte un valor en la PK la cual sera remplazada por el trigger, el problema es que si realizas in insert masivo te marcara una violacion de llave primaria
pero si lo quieres utilizar en procesos como son folios de factura etc en los cuales solo se realiza un inser no creo que exista ningun problema
CREATE TRIGGER ti_Color ON dbo.Color
FOR INSERT AS
begin
DECLARE @nf int
EXECUTE SP_GeneraFolio 'Color', @nf OUTPUT
UPDATE dbo.Color SET idColor = @nf WHERE idColor = igual al valor del defalt
end
Si tienes otra duda con gusto lo platicamos
o si quieres que busquemos una solucion
es lo mismo
lo del valor default es para que se inserte un valor en la PK la cual sera remplazada por el trigger, el problema es que si realizas in insert masivo te marcara una violacion de llave primaria
pero si lo quieres utilizar en procesos como son folios de factura etc en los cuales solo se realiza un inser no creo que exista ningun problema
CREATE TRIGGER ti_Color ON dbo.Color
FOR INSERT AS
begin
DECLARE @nf int
EXECUTE SP_GeneraFolio 'Color', @nf OUTPUT
UPDATE dbo.Color SET idColor = @nf WHERE idColor = igual al valor del defalt
end
Si tienes otra duda con gusto lo platicamos
o si quieres que busquemos una solucion
es lo mismo
Estimado
Debes ver la documentacion del libro en pantalla, y buscar Identitty, lee muy bien esto, alli esta la solucion a tu problema
Ejemplos
Este ejemplo crea dos tablas, TZ y TY, y un desencadenador INSERT en TZ. Cuando se inserta una fila en TZ, el desencadenador (Ztrig) se activa e inserta una fila en TY.
USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)
INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')
SELECT * FROM TZ
--Result set: This is how table TZ looks
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla
CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL)
INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')
SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END
/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/
@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
V茅ase tambi茅n
@@IDENTITY
Saludos
Cordiales
Edo.A.A.
Debes ver la documentacion del libro en pantalla, y buscar Identitty, lee muy bien esto, alli esta la solucion a tu problema
Ejemplos
Este ejemplo crea dos tablas, TZ y TY, y un desencadenador INSERT en TZ. Cuando se inserta una fila en TZ, el desencadenador (Ztrig) se activa e inserta una fila en TY.
USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)
INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')
SELECT * FROM TZ
--Result set: This is how table TZ looks
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla
CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL)
INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')
SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator
/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END
/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/
@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
V茅ase tambi茅n
@@IDENTITY
Saludos
Cordiales
Edo.A.A.
