Contro de Error en DELETE

17/02/2005 - 15:42 por Pamela | Informe spam
Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
17/02/2005 - 16:01 | Informe spam
Pamela,

Puedes chequear que no estes borrando padres con hijos asociados (preferible
si usas un procedimiento almacenado, desde el cual pudieras enviar un error
amigable a la aplicacion que trata de borrar) o puedes usar la clausula ON
DELETE CASCADE en la definicion de la clave foranea.

Ejemplo:

use northwind
go

create table t1(colA int primary key)
go

create table t2(
colA int,
constraint fk_t2_t1_colA foreign key (colA) references t1(colA) on delete
cascade)
go

insert into t1 values(1)
insert into t1 values(2)

insert into t2 values(1)
insert into t2 values(1)
insert into t2 values(1)
insert into t2 values(2)
go

select * from t1
select * from t2
go

delete from t1 where colA = 1
go

select * from t1
select * from t2
go

alter table t2 drop constraint fk_t2_t1_colA
go

alter table t2 add constraint fk_t2_t1_colA foreign key (colA) references
t1(colA)
go

create procedure proc1
@par1 int
as
set nocount on

if exists(select * from t2 where colA = @par1)
begin
raiserror('No se puede borrar en tabla t1 porque existen filas asociadas en
tabla t2 para la clave [%d].', 16, 1, @par1)
return 0
end

delete t1 where colA = @par1

return @@error
go

execute proc1 @par1 = 2
go

drop procedure proc1
go

drop table t2, t1
go


AMB


"Pamela" wrote:

Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.

Respuesta Responder a este mensaje
#2 Gustavo Larriera [MVP]
17/02/2005 - 16:02 | Informe spam
Por qué no programas el DELETE para que borre registros WHERE no exista
el registro correspondiente en la tabla relacionada por la FK ?

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.



"Pamela" wrote in message
news::
Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.
Respuesta Responder a este mensaje
#3 Tinoco
17/02/2005 - 16:09 | Informe spam
Hola Pamela,

Dos cosas:
1. Se puede crear un SP que verifique las llaves foraneas antes de ejecutar
la instruccion de eliminacion. Algo como:
IF EXISTS()
SELECT 1
ELSE
SELECT 0

2. O mejor aun se puede acomodar el aplicativo cliente, para validar el
numero de error generado por SQL Server y generar en conjunto con este un
mensaje mas claro. Normalmente estos errores tienen el mismo numero.

Hermilson Tinoco
Colombia

"Pamela" wrote:

Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.

Respuesta Responder a este mensaje
#4 Pamela
17/02/2005 - 18:59 | Informe spam
lo que yo quiero es borrar cuando no exista relacion y si
existe entregar un mensaje sin que le aparezca un error al
usuario
que no aparezca ni error ni warnings

Por qué no programas el DELETE para que borre registros


WHERE no exista
el registro correspondiente en la tabla relacionada por


la FK ?

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y


no otorga ningun
derecho / This posting is provided "AS IS" with no


warranties, and
confers no rights.



"Pamela" wrote in


message
news::
Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure




PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción




COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.



.

Respuesta Responder a este mensaje
#5 Maxi
17/02/2005 - 19:13 | Informe spam
Hola, entonces Pame hacelo con If exists

te paso un ejemplo de un SP en el cual estoy trabajando justamente en estos
momentos ;-)


IF OBJECT_ID('FSC_SP_SERVICIO_P_C') IS NOT NULL
DROP PROC FSC_SP_SERVICIO_P_C
GO

CREATE PROC FSC_SP_SERVICIO_P_C @VENDOR_ID VARCHAR(30),@FECHA varchar(10),
@DISPATH_ID VARCHAR(30),@ID VARCHAR(30) AS

declare @men varchar(150)

SET NOCOUNT ON

IF NOT EXISTS (SELECT ID FROM FSC_SERVICIOS_P WHERE ID=@ID)
BEGIN

INSERT INTO FSC_SERVICIOS_P (ID,FECHA,DISPATH_ID,VENDOR_ID) VALUES
(@ID,@FECHA,@DISPATH_ID,@VENDOR_ID)

END

ELSE
BEGIN
set @men = 'El recibo : ' + @id + ' ya se encuentra en la Base de
Datos...!!!'


RAISERROR(@men,16,1)
RETURN 99
END



Salu2
Maxi


"Pamela" escribió en el mensaje
news:0fca01c5151a$71a5c730$
lo que yo quiero es borrar cuando no exista relacion y si
existe entregar un mensaje sin que le aparezca un error al
usuario
que no aparezca ni error ni warnings

Por qué no programas el DELETE para que borre registros


WHERE no exista
el registro correspondiente en la tabla relacionada por


la FK ?

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y


no otorga ningun
derecho / This posting is provided "AS IS" with no


warranties, and
confers no rights.



"Pamela" wrote in


message
news::
Hola, estoy ejecutando una instruccion DELETE para una
tabla "A" con clave "Y"la cual es llave foranea de la
tabla "B".
Al ejecutar la instruccion el mensaje de error por
pantalla es el siguiente:

Server: Msg 547, Level 16, State 1, Procedure




PADELCAMPO,
Line 15
Instrucción DELETE en conflicto con la restricción




COLUMN
REFERENCE 'FK_KTUSUUSUARIO_KTGENEPAIS'. El conflicto ha
aparecido en la base de datos 'rmmp_v2',
tabla 'KTUSUUSUARIO', column 'IdPais'.
Se terminó la instrucción.

Existe alguna manera de poder controlar este error,
impidiendo que aparezca por pantalla.

Ya se ha intentado con @@ERROR, pero de todos modos
aparece el mensaje antes descrito.



.

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