Tengo tres tablas, llamémoslas GRANDPARENT
, PARENT
y CHILD
. PARENT
tiene una columna FK para PK de GRANDPARENT
, y CHILD
tiene una columna FK para PK de PARENT
. Hasta aquí todo bien.¿Cómo configurar una vista actualizable con una unión en Firebird?
Ahora quiero configurar una vista que contiene toda la información en CHILD
, más el PK de GRANDPARENT
. Entonces:
CREATE VIEW CHILD_VIEW
(
ID,
PARENT_ID,
OTHER_STUFF,
GRANDPARENT_ID
)
AS
SELECT
C.ID,
C.PARENT_ID,
C.OTHER_STUFF,
C.GRANDPARENT_ID
FROM CHILD C
join PARENT P on P.ID = C.PARENT_ID;
No demasiado difícil. Pero aquí está la parte engañosa: quiero poder INSERT
o UPDATE
a esta vista, y tener todos los datos relevantes escritos en la tabla CHILD
, y el valor GRANDPARENT_ID
, si lo hay, debe ignorarse.
He hecho algunas búsquedas en Google y aparentemente debería ser posible configurar una vista actualizable como esta "mediante el uso de disparadores", pero no explica en ningún lado lo que se supone que debo hacer con los desencadenantes para lograr este efecto. Creo que sé más o menos cómo manejar el caso INSERT
, pero ¿qué pasa con el caso UPDATE
? Las declaraciones UPDATE
tienen WHERE
cláusulas, y pueden contener o no columnas arbitrarias en la tabla.
Por ejemplo, ¿cómo utilizo un disparador para transformar algo como update CHILD_VIEW set (blah blah blah) where ID = 5
en update CHILD set (blah blah blah excluding GRANDPARENT_ID) where ID = 5
?
Buena pregunta acerca de la 'UPDATE' de sólo algunas columnas ... que yo sepa no hay no es forma de detectar qué columnas están incluidas en la instrucción 'UPDATE' que provocó que el disparador' ON UPDATE' se dispare. Creo que vale la pena solicitar una función en el rastreador de Firebird, si no hay uno. – ain
¿No debería en su código 'C.GRANDPARENT_ID' ser' P.GRANDPARENT_ID'? – EMBarbosa
sin vista de tabla múltiple 'INSERT' /' UPDATE's? booooo! –