Ayuda con el RAISERROR

18/09/2007 - 16:36 por Víctor | Informe spam
Hola, estuve leyendo la ayuda del SQL Server 7 y tengo una duda, en el
momento de crear las relaciones entre las tablas, los desencadenadores de
crean de manera automática?, y como utilizo la sentencia raiserror si se
infringe la integridad referencial al tratar de eliminar un registro que
esta siendo utilizado en otra tabla?, muchas gracias a los que puedan
aclararme el panorama.

Víctor

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/09/2007 - 17:46 | Informe spam
Hola Victor,

No recuerdo mucho de la version 7, pero te dire que los desencadenadores no
tienen relacion directa con la declaracion de integridad referencial. Si usas
DRI con la opcion de actualizacion o borrado en cascada, eso es llevado a
cabo internamente por el motor. Es mas, las restricciones de integridad
tienen preferencia ante los desencadenadores, por lo que cuando existe un
error de integridad referencial, si existe algun desencadenador, este no se
disparara.

Ejemplo:

Estoy usando SS 2005 DE, pero creo es el mismo principio para 7.0

use tempdb
go

create table dbo.t1(
c1 int not null primary key
)
go

create table dbo.t2(
c1 int not null primary key,
c2 int not null,
constraint fk_t2_t1 foreign key (c2) references dbo.t1(c1)
)
go

create trigger tr_t1_del on dbo.t1
for delete
as
raiserror('pase por aqui!', 16, 1)
go

insert into dbo.t1 values(1)
insert into dbo.t2 values(1, 1)
go

delete dbo.t1
where c1 = 1
go

drop table dbo.t2, dbo.t1
go

Resultado:

Msg 547, Level 16, State 0, Line 7
The DELETE statement conflicted with the REFERENCE constraint "fk_t2_t1".
The conflict occurred in database "tempdb", table "dbo.t2", column 'c2'.
The statement has been terminated.

Como vez, el desencadenador nunca se disparo.


AMB


"Víctor" wrote:

Mostrar la cita
#2 Gustavo Larriera (MVP)
18/09/2007 - 20:46 | Informe spam
Si no recuerdo mal, en SQL Server 7.0 no se disponía de integridad
referencial declarativa en cascada (DRI).

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Alejandro Mesa" wrote:

Mostrar la cita
#3 Alejandro Mesa
18/09/2007 - 22:28 | Informe spam
Hola Gustavo,

De verdad no recuerdo y no tengo a mano los BOL de la version 7. De todas
manera, no dije que existiese, pero si dejo claro que aunque existiese, no
puede combinarse DRI y desencadenadores a la misma vez para llevar a cabo el
mismo objetivo. Si se quieren usar desencadenadores para enforzar la
integridad referencial de forma procedural, entonces no se puede usar DRI
porque las restricciones de clave foranea tienen mayor prioridad y no dejaran
que el desencadenador se dispare, como se ve en el ejemplo que adjunte.

Saludos,
Alejandro Mesa


"Gustavo Larriera (MVP)" wrote:

Mostrar la cita
#4 Víctor
19/09/2007 - 07:26 | Informe spam
Gracias por responder, sucede que estoy buscando la manera de eliminar un
registro y que si este esta siendo utilizado en otras tablas pueda capturar
el error y devolverselo al cliente que esta ejecutando la acción. Se que SQL
emite un error por eso, pero no se como devolverselo al usuario. Estoy
utilizando SQL 7 y FOX 9.
Gracias por responder


"Alejandro Mesa" escribió en el
mensaje news:
Mostrar la cita
#5 Alejandro Mesa
19/09/2007 - 15:42 | Informe spam
Victor,

Puedes capturar y formatear el error (mensaje mas amigable) en la aplicacion
cliente. Tambien puedes agregar un mensaje a la tabla de mensajes, capturar
el error en el procedimiento almacenado y usar RAISERROR para devolver el
mensaje deseado hacia la aplicacion cliente. checquea el sp [sp_addmessage]
en los libros en linea.

Error Handling in SQL Server – a Background
http://www.sommarskog.se/error-handling-I.html

Implementing Error Handling with Stored Procedures
http://www.sommarskog.se/error-hand...aseoferror

AMB

"Víctor" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida