Ayuda con trigger en SQL Server

Hola buenas, necesito ayuda con un trigger que no se como hacerlo. Básicamente, tengo una tabla llamada Tarifa, en la cual guardo
Tarifa: idTarifa, nombreTarifa, precioTarifa,duracionMesTarfia

Y Socio, en la cual guardo:
Socio: idSocio, dniSocio, nombreSocio, apellidosSocio, tlfSocio, dirSocio, cpSocio, ciudadSocio, idTarjeta, dateIniTarifa, dateFinTarifa,


Me gustaría que al guardar el id de la tarifa que el socio contrata, se registre automáticamente la fecha en la que la contrata (dateIniTarfia) y la ficha final (dateFinTarifa), que dependería de "duracionMesTarfia".
Es decir, que si es 1/1/2016 y contrato una tarifa trimestral (duracionMesTarfia = 3), automáticamente meta en dateIniTarifa (1/1/2016) y en dateFinTarfica (1/4/2016).

Gracias de antemano [angelito]
¿Cómo sabes qué tarifa contrata el socio si no tienes ningún campo o tabla que relacione ambas? ¿No te falta una tabla por ahí con una estructura del tipo (Promociones: idTarifa, idSocio, dateInicio)?

Y los campos de las fechas en la tabla de socios... casi que sobran. Al menos por lo poco que recuerdo de las formas normales y tal.
Deschamps escribió:¿Cómo sabes qué tarifa contrata el socio si no tienes ningún campo o tabla que relacione ambas? ¿No te falta una tabla por ahí con una estructura del tipo (Promociones: idTarifa, idSocio, dateInicio)?

Y los campos de las fechas en la tabla de socios... casi que sobran. Al menos por lo poco que recuerdo de las formas normales y tal.

Se me ha olvidado poner que la Primary key de Tarifa idTarifa esta en la tabla Socio como Foreign key. Lo de que la fecha este en el socio es por la relacion 1:N entre Tarifa-Socio. Es decir, una tarifa lo pueden contratar un socio o muchos socios (1:N), pero un socio solo puede contratar una tarrifa (1-1). Esta interrelación da como resultado 1:N, por lo que la primary key de Tarifa pasa a Socio, junto a los atributos de la interrelacion dateIni y date Fin.
Primero intenta hacerlo y luego te pasas el código de lo que no sepas hacer para que te ayudemos :-|
Que te solucionen los deberes no creo que sea lo mejor para que aprendas xD
[-jorge-] escribió:
Deschamps escribió:¿Cómo sabes qué tarifa contrata el socio si no tienes ningún campo o tabla que relacione ambas? ¿No te falta una tabla por ahí con una estructura del tipo (Promociones: idTarifa, idSocio, dateInicio)?

Y los campos de las fechas en la tabla de socios... casi que sobran. Al menos por lo poco que recuerdo de las formas normales y tal.


Se me ha olvidado poner que la Primary key de Tarifa idTarifa esta en la tabla Socio como Foreign key. Lo de que la fecha este en el socio es por la relacion 1:N entre Tarifa-Socio. Es decir, una tarifa lo pueden contratar un socio o muchos socios (1:N), pero un socio solo puede contratar una tarrifa (1-1). Esta interrelación da como resultado 1:N, por lo que la primary key de Tarifa pasa a Socio, junto a los atributos de la interrelacion dateIni y date Fin.



¿Y cuando quieras consultar un histórico de las tarifas que ha contratado un socio a lo largo del tiempo? ¿Y si un socio no tiene ninguna tarifa contratada? Creo que no cumples siquiera la primera forma normal.

Lo ideal sería que tuvieras una nueva tabla como ya apunté antes con las llaves primarias de cada tabla de catálogo (tarifas y socios) y la fecha (relaciones 1:N de ambas con ésta otra).

En ese contexto no tiene mucho sentido usar un disparador, porque durante la inserción de un registro en esa tabla (es decir, cuando un cliente contrata una tarifa determinada) ya puedes asignar fecha de inicio directamente con un GETDATE() (o lo que toque, nunca he usado SQL Server y no conozco su sintaxis).

Si en las vistas no quieres hacer consultas y calculos adiconales (que sería lo recomendable a menos que el volumen de datos sea enorme), entonces puedes añadir dateFinal a esa tercera tabla del mismo modo que con la fecha de inicio.
Si a lo largo del tiempo un socio puede tener varias tarifas distintas, aunque en un instante dado solo pueda tener una, la relación es de N:N como te indican, por lo que necesitas una tabla adicional que refleje la relación entre ambas tablas.
5 respuestas