Ayuda con trigger y regla

21/02/2009 - 22:17 por María | Informe spam
Tabla Direcciones
codigo,nombre, .., DireccionPrincipal

El campo DireccionPrincipal es un bit (logico) para indicar si la direccion
es la principal.

Como regla, necesito que la tabla tenga solo un registro marcado como
DireccionPrincipal.

La tabla permite inserciones y actualizaciones.

Estoy pensandolo en un trigger pero no encuentro como hacerlo ya que se
podria mandar actualizaciones de varios registros ya que asi son los
triggers.

Muchas gracias por cualquier ayuda.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
22/02/2009 - 17:50 | Informe spam
María,

- Esta tabla mantiene las direcciones de ...? - clientes, empleados, etc.
- Cual es la clave primaria de esta tabla?
- Quieres mantener una unica direccion principal por ...? - clienteId,
empleadoId, etc.

Que raro que no usas una tabla de intersección para expresar esta relación
que parece ser de muchas a muchas.

Supongamos que esta es una tabla de intersección, donde se tiene la pk de el
cliente y la pk de la direccion, algo asi como:

clienteDireccion (clienteId, direccionId, direccionPrincipal, ...)

y que tenemos las sgtes restricciones.

pk (clienteId, direccionId)
fk (clienteId) references cliente(clienteId)
fk (dirId) references direccion(direccionId)

create trigger tr_clienteDireccion_InsUp on clienteDireccion
for insert, update
as
if @@rowcount = 0 return;

set nocount on;

if exists (
select
*
from
clienteDireccion as cd
inner join
(select distinct i.ClienteId from inserted as i) as d
on cd.clienteId = d.clienteId
where
cd.direccionPrincipal = 1
group by
cd.clienteId
having
count(*) > 1
)
begin
raiserror('Error, cada cliente puede tener una sola dir como
principal.', 16, 1);
rollback transaction;
end
go

AMB


"María" wrote:

Tabla Direcciones
codigo,nombre, .., DireccionPrincipal

El campo DireccionPrincipal es un bit (logico) para indicar si la direccion
es la principal.

Como regla, necesito que la tabla tenga solo un registro marcado como
DireccionPrincipal.

La tabla permite inserciones y actualizaciones.

Estoy pensandolo en un trigger pero no encuentro como hacerlo ya que se
podria mandar actualizaciones de varios registros ya que asi son los
triggers.

Muchas gracias por cualquier ayuda.



Respuesta Responder a este mensaje
#2 María
22/02/2009 - 22:11 | Informe spam
Si , tienes razon, no lo puse completo ya que no indiqué la pk de la otra
tabla propietaria de las direcciones.
En realidad son 'ShipTo adresses' de los clientes.

Algo asi, segun lo que tu mismo has indicado:
ClienteID, DireccionID, nombre, direccionPrincipal...
Lo que ocurre es que la PK en esta tabla es compuesta, sería: ClienteID,
DireccionID, es decir las direcciones no existen independientemente sino que
dependen del cliente.

El campo nombre se refiere a una identificación breve de la dirección.,
ejemplo 'Sucursal Tal'.

De todos modos con lo que indicaste ya entiendo que puedo implementarlo con
un Count(*).

mil gracias


- Esta tabla mantiene las direcciones de ...? - clientes, empleados, etc.
- Cual es la clave primaria de esta tabla?
- Quieres mantener una unica direccion principal por ...? - clienteId,
empleadoId, etc.

Que raro que no usas una tabla de intersección para expresar esta relación
que parece ser de muchas a muchas.

Supongamos que esta es una tabla de intersección, donde se tiene la pk de
el
cliente y la pk de la direccion, algo asi como:

clienteDireccion (clienteId, direccionId, direccionPrincipal, ...)

y que tenemos las sgtes restricciones.

pk (clienteId, direccionId)
fk (clienteId) references cliente(clienteId)
fk (dirId) references direccion(direccionId)

create trigger tr_clienteDireccion_InsUp on clienteDireccion
for insert, update
as
if @@rowcount = 0 return;

set nocount on;

if exists (
select
*
from
clienteDireccion as cd
inner join
(select distinct i.ClienteId from inserted as i) as d
on cd.clienteId = d.clienteId
where
cd.direccionPrincipal = 1
group by
cd.clienteId
having
count(*) > 1
)
begin
raiserror('Error, cada cliente puede tener una sola dir como
principal.', 16, 1);
rollback transaction;
end
go

AMB


"María" wrote:

Tabla Direcciones
codigo,nombre, .., DireccionPrincipal

El campo DireccionPrincipal es un bit (logico) para indicar si la
direccion
es la principal.

Como regla, necesito que la tabla tenga solo un registro marcado como
DireccionPrincipal.

La tabla permite inserciones y actualizaciones.

Estoy pensandolo en un trigger pero no encuentro como hacerlo ya que se
podria mandar actualizaciones de varios registros ya que asi son los
triggers.

Muchas gracias por cualquier ayuda.



Respuesta Responder a este mensaje
#3 María
24/02/2009 - 15:26 | Informe spam
Otra pregunta,

Y si en vez de controlarlo como regla se prefiere usarlo de la siguiente
manera:
Que si se marca una como principal, todas las demas se actualicen
automaticamente a no principal.
Se podria con un trigger ?



"Alejandro Mesa" escribió en el
mensaje news:
María,

- Esta tabla mantiene las direcciones de ...? - clientes, empleados, etc.
- Cual es la clave primaria de esta tabla?
- Quieres mantener una unica direccion principal por ...? - clienteId,
empleadoId, etc.

Que raro que no usas una tabla de intersección para expresar esta relación
que parece ser de muchas a muchas.

Supongamos que esta es una tabla de intersección, donde se tiene la pk de
el
cliente y la pk de la direccion, algo asi como:

clienteDireccion (clienteId, direccionId, direccionPrincipal, ...)

y que tenemos las sgtes restricciones.

pk (clienteId, direccionId)
fk (clienteId) references cliente(clienteId)
fk (dirId) references direccion(direccionId)

create trigger tr_clienteDireccion_InsUp on clienteDireccion
for insert, update
as
if @@rowcount = 0 return;

set nocount on;

if exists (
select
*
from
clienteDireccion as cd
inner join
(select distinct i.ClienteId from inserted as i) as d
on cd.clienteId = d.clienteId
where
cd.direccionPrincipal = 1
group by
cd.clienteId
having
count(*) > 1
)
begin
raiserror('Error, cada cliente puede tener una sola dir como
principal.', 16, 1);
rollback transaction;
end
go

AMB


"María" wrote:

Tabla Direcciones
codigo,nombre, .., DireccionPrincipal

El campo DireccionPrincipal es un bit (logico) para indicar si la
direccion
es la principal.

Como regla, necesito que la tabla tenga solo un registro marcado como
DireccionPrincipal.

La tabla permite inserciones y actualizaciones.

Estoy pensandolo en un trigger pero no encuentro como hacerlo ya que se
podria mandar actualizaciones de varios registros ya que asi son los
triggers.

Muchas gracias por cualquier ayuda.



Respuesta Responder a este mensaje
#4 Alejandro Mesa
24/02/2009 - 15:58 | Informe spam
María,

De poder, claro que se puede hacer.

AMB

"María" wrote:

Otra pregunta,

Y si en vez de controlarlo como regla se prefiere usarlo de la siguiente
manera:
Que si se marca una como principal, todas las demas se actualicen
automaticamente a no principal.
Se podria con un trigger ?



"Alejandro Mesa" escribió en el
mensaje news:
> María,
>
> - Esta tabla mantiene las direcciones de ...? - clientes, empleados, etc.
> - Cual es la clave primaria de esta tabla?
> - Quieres mantener una unica direccion principal por ...? - clienteId,
> empleadoId, etc.
>
> Que raro que no usas una tabla de intersección para expresar esta relación
> que parece ser de muchas a muchas.
>
> Supongamos que esta es una tabla de intersección, donde se tiene la pk de
> el
> cliente y la pk de la direccion, algo asi como:
>
> clienteDireccion (clienteId, direccionId, direccionPrincipal, ...)
>
> y que tenemos las sgtes restricciones.
>
> pk (clienteId, direccionId)
> fk (clienteId) references cliente(clienteId)
> fk (dirId) references direccion(direccionId)
>
> create trigger tr_clienteDireccion_InsUp on clienteDireccion
> for insert, update
> as
> if @@rowcount = 0 return;
>
> set nocount on;
>
> if exists (
> select
> *
> from
> clienteDireccion as cd
> inner join
> (select distinct i.ClienteId from inserted as i) as d
> on cd.clienteId = d.clienteId
> where
> cd.direccionPrincipal = 1
> group by
> cd.clienteId
> having
> count(*) > 1
> )
> begin
> raiserror('Error, cada cliente puede tener una sola dir como
> principal.', 16, 1);
> rollback transaction;
> end
> go
>
> AMB
>
>
> "María" wrote:
>
>> Tabla Direcciones
>> codigo,nombre, .., DireccionPrincipal
>>
>> El campo DireccionPrincipal es un bit (logico) para indicar si la
>> direccion
>> es la principal.
>>
>> Como regla, necesito que la tabla tenga solo un registro marcado como
>> DireccionPrincipal.
>>
>> La tabla permite inserciones y actualizaciones.
>>
>> Estoy pensandolo en un trigger pero no encuentro como hacerlo ya que se
>> podria mandar actualizaciones de varios registros ya que asi son los
>> triggers.
>>
>> Muchas gracias por cualquier ayuda.
>>
>>
>>



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