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

#6 José Luis
12/02/2007 - 16:58 | Informe spam
Muchísimas gracias Alejandro por tu ayuda!!!

Al fin parece que la cosa empieza a funcionar. También gracias por la
recomendación la tendré en cuenta.

Por cierto abusando de tu amabilidad y viendo que tienes amplios dominios
del tema, me podrías recomendar algún libro, curso o enlaces para aprender a
utilizar el TransactSQL para poder crear procedimientos almacenados?

Gracias de nuevo.

Un saludo,
José Luis.


"Alejandro Mesa" escribió en el
mensaje news:
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
#7 Jordi Maycas
02/03/2007 - 10:48 | Informe spam
En oracle 10g, hay algo que podria orientarte del tipo de poner
enable/disable las restricciones.

" José Luis" <JLB> escribió en el mensaje
news:
Muchísimas gracias Alejandro por tu ayuda!!!

Al fin parece que la cosa empieza a funcionar. También gracias por la
recomendación la tendré en cuenta.

Por cierto abusando de tu amabilidad y viendo que tienes amplios dominios
del tema, me podrías recomendar algún libro, curso o enlaces para aprender
a utilizar el TransactSQL para poder crear procedimientos almacenados?

Gracias de nuevo.

Un saludo,
José Luis.


"Alejandro Mesa" escribió en el
mensaje news:
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.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>>
>>
>>
>>
>












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