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:

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



Respuesta Responder a este mensaje
#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:

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:

> 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
>
>
>
Respuesta Responder a este mensaje
#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:

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:

> 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:
>
> > 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
> >
> >
> >
Respuesta Responder a este mensaje
#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:
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:

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:

> 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:
>
> > 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
> >
> >
> >
Respuesta Responder a este mensaje
#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:

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:
> 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:
>
>> 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:
>>
>> > 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:
>> >
>> > > 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
>> > >
>> > >
>> > >



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