Trigger instead of update

05/07/2007 - 11:33 por Juan Diego Bueno | Informe spam
Buenas grupo:

Pretendo crear una vista indexada que pueda ser modificable y que parte de
varias tablas base. Para poder ser modificable, hay que implementar los
triggers instead of, ya que como he comentado, tira de varias tablas.

Bien, el trigger instead of delete, no lo necesito, puesto que los deletes
se harán siempre sobre la tabla base y las claves foráneas para las tablas
relacionadas se actualizan en cascada
El trigger instead of insert es muy sencillo y ya lo tengo, no tiene mucho
misterio...
Pero el que no se como afrontar es el trigger update. Lo que viene en la
ayuda no hace sino confundirme.

La tabla principal base es Proyectos, y la relacionada es
Proyectos_Autonomias. Esta última, además de la id del proyecto, tiene como
clave fóránea una ID de autonomía. Respecto a las columnas de la primera,
había pensado en evaluar un IF UPDATED(columna) de cada una de las de la
tabla, y de ser así, hacer el update con un join con la tabla inserted. De
todas maneras, eso sería cambiar un update por x... dependiendo de cuantas
columnas hayan cambiado, no se si esto es lo más apropiado.

La tabla relacionada... es otra historia. Si se ha actualizado esa columna
puede pasar:

1. Que ya hubiera un valor de autonomía en esta tabla para ese proyecto y se
cambie por otro valor válido
2. Que anteriormente no hubiera registro de autonomia para ese proyecto, y
en la vista se le de un valor. Se haría el insert sobre esa tabla
3. Que ya hubiera un valor de autonomía en esa tabla para ese proyecto y se
le de un valor de cadena vacía (es de tipo varchar), eso debería borrar
entonces el registro de la tabla relacionada

Esta parte ya me mosquea más, puesto que si son varios los registros que se
actualizan tendría que mirar tanto con la tabla deleted como con la inserted
registro por registro... y ya no tengo tan claro como hacerlo (salvo por
cursores, claro)

Espero sugerencias. Gracias de antemano

Trabajo con SQL Server 2005

http://www.moondance.tk

Preguntas similare

Leer las respuestas

#1 Ricardo Passians
06/07/2007 - 13:16 | Informe spam
Para simplificar y comprender mejor el asunto puedes evaluar la posibilidad
de dividir el problema manteniendo triggers de update también independientes
para cada tabla de la vista.



Pretendo crear una vista indexada que pueda ser modificable y que parte de
varias tablas base. Para poder ser modificable, hay que implementar los
triggers








Por si acaso, no confundir lo que es una "vista indexada" con una vista
normal (que pueda tener o no un indice).

Saludos

Ricardo Passians
Respuesta Responder a este mensaje
#2 Alfredo Novoa
06/07/2007 - 13:45 | Informe spam
Hola Juan Diego,

On Thu, 5 Jul 2007 11:33:47 +0200, "Juan Diego Bueno"
wrote:

3. Que ya hubiera un valor de autonomía en esa tabla para ese proyecto y se
le de un valor de cadena vacía (es de tipo varchar), eso debería borrar
entonces el registro de la tabla relacionada

Esta parte ya me mosquea más, puesto que si son varios los registros que se
actualizan tendría que mirar tanto con la tabla deleted como con la inserted
registro por registro... y ya no tengo tan claro como hacerlo (salvo por
cursores, claro)



Pues con consultas, claro :-)

Algo como esto:

delete from Proyectos_Autonomías where id in (select id from inserted
where autonomía = "")


Saludos
Respuesta Responder a este mensaje
#3 Juan Diego Bueno
06/07/2007 - 14:24 | Informe spam
"Ricardo Passians" escribió en el mensaje
news:%
Para simplificar y comprender mejor el asunto puedes evaluar la
posibilidad de dividir el problema manteniendo triggers de update también
independientes para cada tabla de la vista.




La idea es introducir/modificar todos los datos partiendo de la tabla base,
y para que salten los triggers en cada tabla de la vista, previamente he de
tener que hacer alguna operación INSERT/UPDATE/DELETE

De todas maneras, ya he resuelto la situación:

Para los campos de la tabla base de proyectos, un update sobre cada uno de
ellos tomando como base inserted

Para la tabla relacionada, dos opciones:

- Borrado de los registros cuyo código de proyecto esté en deleted de la
tabla relacionada, e inserción de aquellos de inserted que no sean nulos
- Un insert, un delete y un update teniendo en cuenta los cambios de deleted
a inserted. Insert cuando un registro tiene nulo en deleted y un valor en
inserted. Delete cuando en deleted hay un valor y en inserted no, y Update
cuando hay valor en deleted y en inserted.

Ambas funcionan bien

Pretendo crear una vista indexada que pueda ser modificable y que parte
de varias tablas base. Para poder ser modificable, hay que implementar
los triggers








Por si acaso, no confundir lo que es una "vista indexada" con una vista
normal (que pueda tener o no un indice).



Considero vista indexada la que se crea con with schemabinding y a la que se
le crean los índices necesarios

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