Volver a poner a null un campo FK.

09/02/2007 - 17:25 por José Luis | Informe spam
Hola a todos,

estoy migrando una aplicación a usar como base de datos SQL Server 2005.
Después de mucho pelearme y gracias también a la ayuda de algunos compañeros
de este foro consegui hacer que la integridad referencial funcionara tal
como quería. Es decir, los campos FK no tengan que tener necesariamente
valor sino que puedan ser nulos.

El problema me ha venido cuando tengo un registro que en el campo fk ya
tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta el
siguiente error:

Mens 44446, Nivel 16, Estado 1, Procedimiento TrigU_htl_precios_billete,
Línea 1

Cannot add or change record. Referential integrity rules require a related
record in table 'htl_proveedores'.

Mens. 3609, Nivel 16, Estado 1, Línea 1

La transacción terminó en el desencadenador. Se anuló el lote.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
09/02/2007 - 17:40 | Informe spam
José Luis,

Crees que puedas postear la estructura de las tablas, incluyendo
restricciones e indices, asi como el texto del trigger que esta fallando?


AMB


"José Luis" wrote:

Hola a todos,

estoy migrando una aplicación a usar como base de datos SQL Server 2005.
Después de mucho pelearme y gracias también a la ayuda de algunos compañeros
de este foro consegui hacer que la integridad referencial funcionara tal
como quería. Es decir, los campos FK no tengan que tener necesariamente
valor sino que puedan ser nulos.

El problema me ha venido cuando tengo un registro que en el campo fk ya
tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta el
siguiente error:

Mens 44446, Nivel 16, Estado 1, Procedimiento TrigU_htl_precios_billete,
Línea 1

Cannot add or change record. Referential integrity rules require a related
record in table 'htl_proveedores'.

Mens. 3609, Nivel 16, Estado 1, Línea 1

La transacción terminó en el desencadenador. Se anuló el lote.







Respuesta Responder a este mensaje
#2 José Luis
09/02/2007 - 18:09 | Informe spam
Buenas Alejandro,

por su puesto que si, faltaría más!!! Muchas gracias por anticipado por tu
ayuda:

USE [isvbd]

GO

/****** Objeto: Table [dbo].[htl_precios_billete] Fecha de la secuencia de
comandos: 02/09/2007 17:22:07 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[htl_precios_billete](

[id_precio_billete] [char](10) COLLATE Modern_Spanish_CI_AS NOT NULL,

[fk_iata_origen] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[fk_iata_destino] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[precio_ml] [numeric](11, 2) NOT NULL,

[fk_proveedor] [char](10) COLLATE Modern_Spanish_CI_AS NULL CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL),

[fk_tarifa] [char](10) COLLATE Modern_Spanish_CI_AS NULL

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_destino] FOREIGN KEY([fk_iata_destino])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
[fk_fk_iata_destino]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_origen] FOREIGN KEY([fk_iata_origen])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_iata_origen]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_proveedor] FOREIGN KEY([fk_proveedor])

REFERENCES [dbo].[htl_proveedores] ([id_g_proveedor])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_proveedor]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_tarifa] FOREIGN KEY([fk_tarifa])

REFERENCES [dbo].[htl_tarifa] ([id_tarifa])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_tarifa]



Y el trigger

ALTER TABLE [dbo].[htl_precios_billete] ADD CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL) FOR [fk_proveedor]



Muchas gracias,

Un saludo,

José Luis.

"Alejandro Mesa" escribió en el
mensaje news:
José Luis,

Crees que puedas postear la estructura de las tablas, incluyendo
restricciones e indices, asi como el texto del trigger que esta fallando?


AMB


"José Luis" wrote:

Hola a todos,

estoy migrando una aplicación a usar como base de datos SQL Server 2005.
Después de mucho pelearme y gracias también a la ayuda de algunos
compañeros
de este foro consegui hacer que la integridad referencial funcionara tal
como quería. Es decir, los campos FK no tengan que tener necesariamente
valor sino que puedan ser nulos.

El problema me ha venido cuando tengo un registro que en el campo fk ya
tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta el
siguiente error:

Mens 44446, Nivel 16, Estado 1, Procedimiento TrigU_htl_precios_billete,
Línea 1

Cannot add or change record. Referential integrity rules require a
related
record in table 'htl_proveedores'.

Mens. 3609, Nivel 16, Estado 1, Línea 1

La transacción terminó en el desencadenador. Se anuló el lote.










Respuesta Responder a este mensaje
#3 Alejandro Mesa
09/02/2007 - 20:58 | Informe spam
José Luis,

Que paso con el codigo del trigger?


AMB


"José Luis" wrote:

Buenas Alejandro,

por su puesto que si, faltaría más!!! Muchas gracias por anticipado por tu
ayuda:

USE [isvbd]

GO

/****** Objeto: Table [dbo].[htl_precios_billete] Fecha de la secuencia de
comandos: 02/09/2007 17:22:07 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[htl_precios_billete](

[id_precio_billete] [char](10) COLLATE Modern_Spanish_CI_AS NOT NULL,

[fk_iata_origen] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[fk_iata_destino] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[precio_ml] [numeric](11, 2) NOT NULL,

[fk_proveedor] [char](10) COLLATE Modern_Spanish_CI_AS NULL CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL),

[fk_tarifa] [char](10) COLLATE Modern_Spanish_CI_AS NULL

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_destino] FOREIGN KEY([fk_iata_destino])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
[fk_fk_iata_destino]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_origen] FOREIGN KEY([fk_iata_origen])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_iata_origen]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_proveedor] FOREIGN KEY([fk_proveedor])

REFERENCES [dbo].[htl_proveedores] ([id_g_proveedor])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_proveedor]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_tarifa] FOREIGN KEY([fk_tarifa])

REFERENCES [dbo].[htl_tarifa] ([id_tarifa])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_tarifa]



Y el trigger

ALTER TABLE [dbo].[htl_precios_billete] ADD CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL) FOR [fk_proveedor]



Muchas gracias,

Un saludo,

José Luis.

"Alejandro Mesa" escribió en el
mensaje news:
> José Luis,
>
> Crees que puedas postear la estructura de las tablas, incluyendo
> restricciones e indices, asi como el texto del trigger que esta fallando?
>
>
> AMB
>
>
> "José Luis" wrote:
>
>> Hola a todos,
>>
>> estoy migrando una aplicación a usar como base de datos SQL Server 2005.
>> Después de mucho pelearme y gracias también a la ayuda de algunos
>> compañeros
>> de este foro consegui hacer que la integridad referencial funcionara tal
>> como quería. Es decir, los campos FK no tengan que tener necesariamente
>> valor sino que puedan ser nulos.
>>
>> El problema me ha venido cuando tengo un registro que en el campo fk ya
>> tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta el
>> siguiente error:
>>
>> Mens 44446, Nivel 16, Estado 1, Procedimiento TrigU_htl_precios_billete,
>> Línea 1
>>
>> Cannot add or change record. Referential integrity rules require a
>> related
>> record in table 'htl_proveedores'.
>>
>> Mens. 3609, Nivel 16, Estado 1, Línea 1
>>
>> La transacción terminó en el desencadenador. Se anuló el lote.
>>
>>
>>
>>
>>
>>
>>
>




Respuesta Responder a este mensaje
#4 José Luis
12/02/2007 - 09:44 | Informe spam
Perdona Alejandro se me paso aquí esta el código:


/* PREVENT UPDATES IF NO MATCHING KEY IN 'htl_proveedores' */
IF UPDATE(fk_proveedor) AND @status<>'Failed'
BEGIN
IF (SELECT COUNT(*) FROM inserted) !(SELECT COUNT(*) FROM htl_proveedores, inserted WHERE
(htl_proveedores.id_g_proveedor = inserted.fk_proveedor))
BEGIN
RAISERROR 44446 'Cannot add or change record. Referential integrity rules
require a related record in table ''htl_proveedores''.'
SELECT @status = 'Failed'
END
END

Muchas gracias d enuevo por la ayuda.

"Alejandro Mesa" escribió en el
mensaje news:
José Luis,

Que paso con el codigo del trigger?


AMB


"José Luis" wrote:

Buenas Alejandro,

por su puesto que si, faltaría más!!! Muchas gracias por anticipado por
tu
ayuda:

USE [isvbd]

GO

/****** Objeto: Table [dbo].[htl_precios_billete] Fecha de la secuencia
de
comandos: 02/09/2007 17:22:07 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[htl_precios_billete](

[id_precio_billete] [char](10) COLLATE Modern_Spanish_CI_AS NOT NULL,

[fk_iata_origen] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[fk_iata_destino] [char](3) COLLATE Modern_Spanish_CI_AS NULL,

[precio_ml] [numeric](11, 2) NOT NULL,

[fk_proveedor] [char](10) COLLATE Modern_Spanish_CI_AS NULL CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL),

[fk_tarifa] [char](10) COLLATE Modern_Spanish_CI_AS NULL

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_destino] FOREIGN KEY([fk_iata_destino])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
[fk_fk_iata_destino]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_iata_origen] FOREIGN KEY([fk_iata_origen])

REFERENCES [dbo].[htl_iatas] ([id_iata])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
[fk_fk_iata_origen]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_proveedor] FOREIGN KEY([fk_proveedor])

REFERENCES [dbo].[htl_proveedores] ([id_g_proveedor])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
[fk_fk_proveedor]

GO

ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
[fk_fk_tarifa] FOREIGN KEY([fk_tarifa])

REFERENCES [dbo].[htl_tarifa] ([id_tarifa])

GO

ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_tarifa]



Y el trigger

ALTER TABLE [dbo].[htl_precios_billete] ADD CONSTRAINT
[DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL) FOR [fk_proveedor]



Muchas gracias,

Un saludo,

José Luis.

"Alejandro Mesa" escribió en el
mensaje news:
> José Luis,
>
> Crees que puedas postear la estructura de las tablas, incluyendo
> restricciones e indices, asi como el texto del trigger que esta
> fallando?
>
>
> AMB
>
>
> "José Luis" wrote:
>
>> Hola a todos,
>>
>> estoy migrando una aplicación a usar como base de datos SQL Server
>> 2005.
>> Después de mucho pelearme y gracias también a la ayuda de algunos
>> compañeros
>> de este foro consegui hacer que la integridad referencial funcionara
>> tal
>> como quería. Es decir, los campos FK no tengan que tener
>> necesariamente
>> valor sino que puedan ser nulos.
>>
>> El problema me ha venido cuando tengo un registro que en el campo fk
>> ya
>> tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta
>> el
>> siguiente error:
>>
>> Mens 44446, Nivel 16, Estado 1, Procedimiento
>> TrigU_htl_precios_billete,
>> Línea 1
>>
>> Cannot add or change record. Referential integrity rules require a
>> related
>> record in table 'htl_proveedores'.
>>
>> Mens. 3609, Nivel 16, Estado 1, Línea 1
>>
>> La transacción terminó en el desencadenador. Se anuló el lote.
>>
>>
>>
>>
>>
>>
>>
>







Respuesta Responder a este mensaje
#5 Alejandro Mesa
12/02/2007 - 14:51 | Informe spam
José Luis,

Trata lo sgte:

/* PREVENT UPDATES IF NO MATCHING KEY IN 'htl_proveedores' */
IF UPDATE(fk_proveedor) AND @status<>'Failed'
BEGIN
IF exists(
SELECT *
FROM inserted as i
where
fk_proveedor is not null
and not exists (
SELECT *
FROM htl_proveedores as p
WHERE p.id_g_proveedor = i.fk_proveedor
)
)
BEGIN
RAISERROR 44446 'Cannot add or change record. Referential integrity rules
require a related record in table ''htl_proveedores''.'
SELECT @status = 'Failed'
END
END
...

2 - No creo que sea una buena practica nombrar las columnas de acuerdo a la
restriccion en la que participan. Si mañana esa regla de negocio cambia,
tendras que cambiar bastante tu codigo.

fk_proveedor --> id_g_proveedor


AMB



"José Luis" wrote:

Perdona Alejandro se me paso aquí esta el código:


/* PREVENT UPDATES IF NO MATCHING KEY IN 'htl_proveedores' */
IF UPDATE(fk_proveedor) AND @status<>'Failed'
BEGIN
IF (SELECT COUNT(*) FROM inserted) !> (SELECT COUNT(*) FROM htl_proveedores, inserted WHERE
(htl_proveedores.id_g_proveedor = inserted.fk_proveedor))
BEGIN
RAISERROR 44446 'Cannot add or change record. Referential integrity rules
require a related record in table ''htl_proveedores''.'
SELECT @status = 'Failed'
END
END

Muchas gracias d enuevo por la ayuda.

"Alejandro Mesa" escribió en el
mensaje news:
> José Luis,
>
> Que paso con el codigo del trigger?
>
>
> AMB
>
>
> "José Luis" wrote:
>
>> Buenas Alejandro,
>>
>> por su puesto que si, faltaría más!!! Muchas gracias por anticipado por
>> tu
>> ayuda:
>>
>> USE [isvbd]
>>
>> GO
>>
>> /****** Objeto: Table [dbo].[htl_precios_billete] Fecha de la secuencia
>> de
>> comandos: 02/09/2007 17:22:07 ******/
>>
>> SET ANSI_NULLS ON
>>
>> GO
>>
>> SET QUOTED_IDENTIFIER ON
>>
>> GO
>>
>> SET ANSI_PADDING ON
>>
>> GO
>>
>> CREATE TABLE [dbo].[htl_precios_billete](
>>
>> [id_precio_billete] [char](10) COLLATE Modern_Spanish_CI_AS NOT NULL,
>>
>> [fk_iata_origen] [char](3) COLLATE Modern_Spanish_CI_AS NULL,
>>
>> [fk_iata_destino] [char](3) COLLATE Modern_Spanish_CI_AS NULL,
>>
>> [precio_ml] [numeric](11, 2) NOT NULL,
>>
>> [fk_proveedor] [char](10) COLLATE Modern_Spanish_CI_AS NULL CONSTRAINT
>> [DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL),
>>
>> [fk_tarifa] [char](10) COLLATE Modern_Spanish_CI_AS NULL
>>
>> ) ON [PRIMARY]
>>
>> GO
>>
>> SET ANSI_PADDING OFF
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
>> [fk_fk_iata_destino] FOREIGN KEY([fk_iata_destino])
>>
>> REFERENCES [dbo].[htl_iatas] ([id_iata])
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
>> [fk_fk_iata_destino]
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
>> [fk_fk_iata_origen] FOREIGN KEY([fk_iata_origen])
>>
>> REFERENCES [dbo].[htl_iatas] ([id_iata])
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
>> [fk_fk_iata_origen]
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
>> [fk_fk_proveedor] FOREIGN KEY([fk_proveedor])
>>
>> REFERENCES [dbo].[htl_proveedores] ([id_g_proveedor])
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT
>> [fk_fk_proveedor]
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] WITH CHECK ADD CONSTRAINT
>> [fk_fk_tarifa] FOREIGN KEY([fk_tarifa])
>>
>> REFERENCES [dbo].[htl_tarifa] ([id_tarifa])
>>
>> GO
>>
>> ALTER TABLE [dbo].[htl_precios_billete] CHECK CONSTRAINT [fk_fk_tarifa]
>>
>>
>>
>> Y el trigger
>>
>> ALTER TABLE [dbo].[htl_precios_billete] ADD CONSTRAINT
>> [DF_htl_precios_billete_fk_proveedor] DEFAULT (NULL) FOR [fk_proveedor]
>>
>>
>>
>> Muchas gracias,
>>
>> Un saludo,
>>
>> José Luis.
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > José Luis,
>> >
>> > Crees que puedas postear la estructura de las tablas, incluyendo
>> > restricciones e indices, asi como el texto del trigger que esta
>> > fallando?
>> >
>> >
>> > AMB
>> >
>> >
>> > "José Luis" wrote:
>> >
>> >> Hola a todos,
>> >>
>> >> estoy migrando una aplicación a usar como base de datos SQL Server
>> >> 2005.
>> >> Después de mucho pelearme y gracias también a la ayuda de algunos
>> >> compañeros
>> >> de este foro consegui hacer que la integridad referencial funcionara
>> >> tal
>> >> como quería. Es decir, los campos FK no tengan que tener
>> >> necesariamente
>> >> valor sino que puedan ser nulos.
>> >>
>> >> El problema me ha venido cuando tengo un registro que en el campo fk
>> >> ya
>> >> tiene valor y lo quiero volver a pasar a nulo. En ese momento me salta
>> >> el
>> >> siguiente error:
>> >>
>> >> Mens 44446, Nivel 16, Estado 1, Procedimiento
>> >> TrigU_htl_precios_billete,
>> >> Línea 1
>> >>
>> >> Cannot add or change record. Referential integrity rules require a
>> >> related
>> >> record in table 'htl_proveedores'.
>> >>
>> >> Mens. 3609, Nivel 16, Estado 1, Línea 1
>> >>
>> >> La transacción terminó en el desencadenador. Se anuló el lote.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>>
>>
>>
>>
>




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida