none
Como puedo realizar este trigger de ?, del tipo after insert. Debe hacer: RRS feed

  • Pregunta

  • Contar si el duenno tiene al menos 1 alquiler en estado pendiente b. Si tiene al menos un alquiler en pendiente debe actualizar el estado del dueño y colocar ‘m’ c. Si no tiene ningún alquiler pendiente debe debe actualizar el estado del dueño y colocar ‘d

    Lo siento pero vengo empezando en sql server y soy estudiante juvenil y en la universidad son muy abstractos con las clases 

    sábado, 27 de abril de 2019 20:52

Respuestas

  • Hola Vorkuz:

    Lo primero tienes que tener claro, el modelo de tablas que estas usando para el ejercicio.

    En este caso por lo que comentas, parece tener dos posibles tablas a definir. 

    Tabla de alquileres, y Tabla de Propietarios.

    Siendo este el caso, entonces, tienes quién va a levantar la acción (no importa sobre quien ni como se opera, sino quien levanta el evento que indica el cambio).

    A priori, yo diría, que el trigger debiera de ser sobre la inserción o actualización de registros en la tabla de alquiler.

    Suponiendo que fuera este, luego puedes definir, si el comportamiento lo levanta el mismo trigger u lo haces en dos triggers.

    Un tipo especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos.

    En castellano, un trigger, es un código, que se ejecuta al ocurrir algo.  
    La definición del mismo se realiza, con un:

    • Create Trigger.
    • Su nombre.
    • Sobre quien opera.
    • Que evento lo lanza
    • Y la definición del mismo.

    Cosas a tener en cuenta muy importantes. Los triggers de insert operan sobre la pseudo tabla inserted.

    Imagínate que en tu modelo yo he definido esto:

    create table alquiler (id int identity(1,1), estado varchar(10), propietario int, monto float)
    go
    
    insert into alquiler (estado, propietario, monto)
    values
    ('pendiente',1,100),
    ('pendiente',1,100),
    ('pendiente',1,100),
    ('n/d',2,100),
    ('pendiente',3,100),
    ('pendiente',1,100),
    ('n/d',2,100),
    ('n/d',3,100);
    go

    Si tengo un trigger after insert en la tabla de alquiler, cuando se desencadene este no tendrá un registro, tendrá varios, tantos como vienen en la sentencia expuesta. Estos vienen en la pseudo tabla llamada inserted

    Inserted tiene las mismas columnas que alquiler. Por tanto inserted tendrá lo siguiente

    {"inserted.id"=xx, "inserted.estado"="pendiente", "inserted.propietario"=1, inserted.monto=100.....}

    y así con todos los registros que se insertan.

    Como del enunciado pareces tener que modificar en otra tabla y los propietarios que vienen pueden ser diferentes, lo más fácil, puede ser declarar una variable de tabla, donde almacenes la cuenta del estado por propietario y la cruces con inserted y en función del resultado, hagas una update del dueño.

    Otra opción, es realizar un cursor sobre cada uno de los registros de inserted. (a mi no me gusta mucho, pero es perfectamente válida)

    Espero te ayude

    • Marcado como respuesta Vorkuz domingo, 28 de abril de 2019 6:56
    domingo, 28 de abril de 2019 5:24

Todas las respuestas

  • Hola Vorkuz:

    Lo primero tienes que tener claro, el modelo de tablas que estas usando para el ejercicio.

    En este caso por lo que comentas, parece tener dos posibles tablas a definir. 

    Tabla de alquileres, y Tabla de Propietarios.

    Siendo este el caso, entonces, tienes quién va a levantar la acción (no importa sobre quien ni como se opera, sino quien levanta el evento que indica el cambio).

    A priori, yo diría, que el trigger debiera de ser sobre la inserción o actualización de registros en la tabla de alquiler.

    Suponiendo que fuera este, luego puedes definir, si el comportamiento lo levanta el mismo trigger u lo haces en dos triggers.

    Un tipo especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos.

    En castellano, un trigger, es un código, que se ejecuta al ocurrir algo.  
    La definición del mismo se realiza, con un:

    • Create Trigger.
    • Su nombre.
    • Sobre quien opera.
    • Que evento lo lanza
    • Y la definición del mismo.

    Cosas a tener en cuenta muy importantes. Los triggers de insert operan sobre la pseudo tabla inserted.

    Imagínate que en tu modelo yo he definido esto:

    create table alquiler (id int identity(1,1), estado varchar(10), propietario int, monto float)
    go
    
    insert into alquiler (estado, propietario, monto)
    values
    ('pendiente',1,100),
    ('pendiente',1,100),
    ('pendiente',1,100),
    ('n/d',2,100),
    ('pendiente',3,100),
    ('pendiente',1,100),
    ('n/d',2,100),
    ('n/d',3,100);
    go

    Si tengo un trigger after insert en la tabla de alquiler, cuando se desencadene este no tendrá un registro, tendrá varios, tantos como vienen en la sentencia expuesta. Estos vienen en la pseudo tabla llamada inserted

    Inserted tiene las mismas columnas que alquiler. Por tanto inserted tendrá lo siguiente

    {"inserted.id"=xx, "inserted.estado"="pendiente", "inserted.propietario"=1, inserted.monto=100.....}

    y así con todos los registros que se insertan.

    Como del enunciado pareces tener que modificar en otra tabla y los propietarios que vienen pueden ser diferentes, lo más fácil, puede ser declarar una variable de tabla, donde almacenes la cuenta del estado por propietario y la cruces con inserted y en función del resultado, hagas una update del dueño.

    Otra opción, es realizar un cursor sobre cada uno de los registros de inserted. (a mi no me gusta mucho, pero es perfectamente válida)

    Espero te ayude

    • Marcado como respuesta Vorkuz domingo, 28 de abril de 2019 6:56
    domingo, 28 de abril de 2019 5:24
  • Gracias de nuevo maestro

    estoy en procesos finales de cuatrimestre me has salavado

    domingo, 28 de abril de 2019 6:56
  • De nada, un placer poder aportar
    domingo, 28 de abril de 2019 8:56