none
Relacion con Trigger y Vistas en Base de datos

    Question

  • Estoy aprendiendo a usar FireBird un servidor de bases de datos anteriormente usaba Access que es muy diferente, según he visto los servidores de bases de datos tienen los procedimientos como almacenar actualizar y demás en el servidor mediante lenguaje SQL.

    Pero necesito comprender la relación que existe entre una Vista que se forma mediante Create View y un trigger pues segun parece se puede agregar un dato mediante una vista ¿es eso correcto? esta conclusión la saco por este ejemplo que encontré en la red.

    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;

    y el trigger esta de esta forma

    CREATE TRIGGER CHILD_VIEW_Save FOR CHILD_VIEW
    ACTIVE BEFORE INSERT OR UPDATE POSITION 10
    AS
    BEGIN
      IF(NEW.ID IS NULL)THEN NEW.ID = GEN_ID(GEN_Child, 1);
      UPDATE OR INSERT INTO CHILD (ID, PARENT_ID, OTHER_STUFF, GRANDPARENT_ID)
                VALUES(NEW.ID, NEW.PARENT_ID, NEW.OTHER_STUFF, NEW.GRANDPARENT_ID);
    END

    Bien la pregunta es:

    ¿Esto significa que se puede agregar datos mediante una vista?

    Si no es asi ¿Entonces que objetivo tiene el INSERT INTO en el trigger?

    Agradezco la ayuda sobre este asunto si este no es el foro correcto para mi consulta agradecería me indiquen donde puedo poner esta consulta gracias.

    Saludos


    Edchar

    • Moved by Alberto PoblacionMVP Wednesday, December 19, 2012 7:04 AM La pregunta versa íntegramente sobre SQL Server y no tiene nada que ver con C# (De:Lenguaje C#)
    Tuesday, December 18, 2012 9:09 PM

Answers

  • necesito comprender la relación que existe entre una Vista que se forma mediante Create View y un trigger pues segun parece se puede agregar un dato mediante una vista

    relacion entre una vista y un trigger no hay ninguna

    la vista almacena la definicion de una relacion entre tablas para acceder a datos de forma simple, cuando la relacion entre las tablas es compleja

    el trigger desencadena acciones en base a modificaciones que se hacen en los datos de la tabla

    ¿Esto significa que se puede agregar datos mediante una vista?

    se podria pero depende de la vista, si esta define campos de una tabla de forma completa quizas puede actualizarse

    pero si unes muchas tablas uniendo algunos campos de cada una, quizas no sea actualizable, porque como sabria la vista que poner en el resto de los campos que no forman parte de la vista pero la tabla los requiere para poder crear el registro

    Si no es asi ¿Entonces que objetivo tiene el INSERT INTO en el trigger?

    es que para agregar el dato a la view debes usar el INSERT

    el trigger reacciona ante la accion del insert para realizar alguna otra tarea o adecuacion de los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by Edchari Friday, December 21, 2012 7:37 PM
    Tuesday, December 18, 2012 9:27 PM
  • El asunto de los Views, Triggers y cómo se comportan ante un INSERT depende del motor de base de datos.  Usted dice que está trabajando con Firebird, así que le recomiendo hacerle la pregunta a Soporte de Firebird:  http://www.firebirdsql.org/en/support/.

    Si estuviéramos hablando de SQL Server, los views aceptan INSERT si las claves primarias de las tablas que conforman la vista están incluidas.  Si este no fuera el caso, la única manera de permitir el INSERT sobre el view sería con un TRIGGER INSTEAD OF INSERT, que puede o puede no ser el equivalente a lo que usted muestra.

    En general le recomiendo buscar soporte de la comunidad de Firebird y no de la comunidad Microsoft.


    Jose R. MCP
    Code Samples

    • Marked as answer by Edchari Friday, December 21, 2012 7:38 PM
    Wednesday, December 19, 2012 5:19 AM

All replies

  • necesito comprender la relación que existe entre una Vista que se forma mediante Create View y un trigger pues segun parece se puede agregar un dato mediante una vista

    relacion entre una vista y un trigger no hay ninguna

    la vista almacena la definicion de una relacion entre tablas para acceder a datos de forma simple, cuando la relacion entre las tablas es compleja

    el trigger desencadena acciones en base a modificaciones que se hacen en los datos de la tabla

    ¿Esto significa que se puede agregar datos mediante una vista?

    se podria pero depende de la vista, si esta define campos de una tabla de forma completa quizas puede actualizarse

    pero si unes muchas tablas uniendo algunos campos de cada una, quizas no sea actualizable, porque como sabria la vista que poner en el resto de los campos que no forman parte de la vista pero la tabla los requiere para poder crear el registro

    Si no es asi ¿Entonces que objetivo tiene el INSERT INTO en el trigger?

    es que para agregar el dato a la view debes usar el INSERT

    el trigger reacciona ante la accion del insert para realizar alguna otra tarea o adecuacion de los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by Edchari Friday, December 21, 2012 7:37 PM
    Tuesday, December 18, 2012 9:27 PM
  • Leandro como siempre tu eres muy oportuno y tu ayuda me ha sido de mucha utilidad, gracias por contestarme.

    Ahora bien eso que expresas de que para agregar el dato a la view debes usar el INSERT

    Según he leído entiendo que la vista se comporta como una tabla ¿es por eso que haces referencia a lo anterior?.

    Y si ese es el caso en el ejemplo que te puse que encontré en la red yo veo lo siguiente

    1º) El CHILD_VIEW me parece que tiene registros que se introducen a la Vista en la parte

    CREATE VIEW CHILD_VIEW
    (
      ID,
      PARENT_ID,
      OTHER_STUFF,
      GRANDPARENT_ID
    )

    2º) El CHILD_VIEW hace una consulta a la tabla CHILD eso lo entiendo pues como dices la vista accede a los datos y me los va a devolver para usarlo como en un informe eso lo hace en.

    SELECT 
      C.ID,
      C.PARENT_ID,
      C.OTHER_STUFF,
      C.GRANDPARENT_ID
    FROM CHILD C
    join PARENT P on P.ID = C.PARENT_ID;

    3º) El trigger hace referencia al CHILD_VIEW mediante FOR CHILD_VIEW eso me parece que esta relacionado con lo que dices de que sirve para agregar los datos al View

    4º) El trigger introduce los datos a la tabla CHAILD y para eso usa los registros de la view según me parece eso lo hace aquí

     IF(NEW.ID IS NULL)THEN NEW.ID = GEN_ID(GEN_Child, 1);
      UPDATE OR INSERT INTO CHILD (ID, PARENT_ID, OTHER_STUFF, GRANDPARENT_ID)
                VALUES(NEW.ID, NEW.PARENT_ID, NEW.OTHER_STUFF, NEW.GRANDPARENT_ID);

    Así que entonces me parece que los datos introducidos a la vista en realidad se terminan introduciendo a la tabla CHAILD.

    Dime si los 4 puntos a los que me he referido son correctos o si alguno de ellos no estoy entendiendo.

    Muchas Gracias pues estoy un poco enredado con esto.


    Edchar

    Wednesday, December 19, 2012 1:29 AM
  • El asunto de los Views, Triggers y cómo se comportan ante un INSERT depende del motor de base de datos.  Usted dice que está trabajando con Firebird, así que le recomiendo hacerle la pregunta a Soporte de Firebird:  http://www.firebirdsql.org/en/support/.

    Si estuviéramos hablando de SQL Server, los views aceptan INSERT si las claves primarias de las tablas que conforman la vista están incluidas.  Si este no fuera el caso, la única manera de permitir el INSERT sobre el view sería con un TRIGGER INSTEAD OF INSERT, que puede o puede no ser el equivalente a lo que usted muestra.

    En general le recomiendo buscar soporte de la comunidad de Firebird y no de la comunidad Microsoft.


    Jose R. MCP
    Code Samples

    • Marked as answer by Edchari Friday, December 21, 2012 7:38 PM
    Wednesday, December 19, 2012 5:19 AM
  • Muchas Gracias WebJose por tus comentarios los aprecio mucho, y si he andado en varios foros pero sin mucho resultado por eso si alguien me pueda dar una mano en este caso lo apreciare mucho, pues necesito aprender un poco y es que me he ido por FireBird por gratuito y que se comporta similar a una DB de Access.

    Por eso sobre los cuatros puntos que exprese anteriormente si me pueden echar una mano como siempre lo agradezco mucho

    Gracias y Saludos


    Edchar


    • Edited by Edchari Wednesday, December 19, 2012 5:46 PM
    Wednesday, December 19, 2012 5:44 PM