Actualizar responsable y estado con un trigger

Necesito crear un trigger para la actualización de un estado y del responsable de la incidencia. Un chico que sabe de esto me dijo ya los campos que se deben de actualizar y me dio algún consejo, pero es que no tengo ni idea ni de la Sintaxis de SQL SERVER. Básicamente pediría que se me ordenara un poco los conceptos.
La acción que se ejecuta cuando tengo que hacer esta actualización es:
ALTER TRIGGER [E_ACTUALIZAR_RESPONSABLE_ESTADO] ON [50004].[AM_ACTION]
FOR INSERT,UPDATE
AS
begin
    IF UPDATE (START_DATE_UT)
    BEGIN
Estas son las condiciones iniciales, y esta parte está casi segura bien, ahora viene lo que yo no consigo hacer:
Se supone que cuando el tipo de acción sea: "Tratamiento del Service Desk" debo cambiar el estado que tengo en SD_REQUEST como "Nuevo" por "Trabajo en Marcha"
Yo esto lo intente así más o menos:
IF (AM_ACTION_TYPE_ID = '34') /*Tratamiento Service Desk*/
        IF SD_STATUS_ID=(SELECT SD_STATUS_ID FROM SD_STATUS WHERE   SD_STATUS_ID='22') /* El 22 es el de Nuevo*/
        SET STATUS_ID= '12' /* El 12 es el que querría */
Y luego ya sería actualizar el responsable de la incidencia que sería algo así como:
SD_REQUEST.OWNER_ID=AM_ACTION.DONE_BY_ID
Como podría poner esto y que funcionara, que me está dando errores por ejemplo en la estructura del SET.
Un saludo y gracias de antemano.

1 Respuesta

Respuesta
1
Creo que la mejor forma de ayudarte es explicándote como funcionan los trigger:
Cuando realizas una operación DDL (insert, update, delete) se pueden crear código que se ejecuta una vez realizado la operación, para esto te sirves de dos tablas:
Deleted y inserted
Es decir: si hago una eliminación de un registro:
select * from deleted -- aqui tienes todos los registros q se eliminaros, en tu caso parece de uno en uno.
si hago una insercion de un registro
select * from inserted -- aqui tienes todos lo datos insertados
si hago una actualizacion de un registro
select * from inserted -- aqui tienes el registro con los campos nuevos
select * from deleted -- aqui tienes los registros con los campos antiguos
Gracias por tu respuesta, pero sinceramente no entiendo muchas cosas, o más bien si las entiendo la mayoría que me comentas pero no sé en este caso como aplicarlas a mi problema.. me sería más útil que me comentaras como puedo poner bien la estructura del set, o en los ejemplos que te puse que me comentaras que tengo mal, puesto que al ejecutar me salen errores de syntasix.
Necesitaría básicamente que te centraras en las lineas de abajo de mi primer mensaje.
Muchas gracias de antemano,
Prueba el siguiente código y acomodalo con tus columnas.
Alter trigger [e_actualizar_responsable_estado] on [50004].[am_action]
for insert,update
as
begin
    if update (start_date_ut)
    begin
  if exists(select count(*) from inserted where tipo_accion='Tratamiento del Service Desk')
begin
update tabla
set SD_REQUEST = 'Trabajo en Marcha'
where id in (select id from inserted)
end
Sorry, pero sigue sin irme, he probado bastantes combinaciones y nada...
Te dejo puesto lo que escribí:
ALTER TRIGGER [E_ACTUALIZAR] ON [50004].[AM_ACTION]
FOR INSERT,UPDATE
AS
BEGIN
    IF UPDATE (START_DATE_UT)
    BEGIN
        IF exists(select count(*) from inserted where ACTION_LABEL_SP='Intervención Service Desk') /*Tratamiento Service Desk con el Requalification*/
        begin
            /*UPDATE tabla*/
        set STATUS_SP='En tramitacion' FROM [50004].[SD_STATUS]            
        where id in (select id from inserted)
        end
    END
END
El update tabla lo puse como comentario porque me daba error...
El set status_sp no sé si es lo que tengo que poner, pero donde está la palabra 'En tramitación' que es la que necesito dejar puesta en lugar de 'Nuevo' está en SD_STATUS.STATUS_SP ahí se encuentra...
Lo de al lado del set de FROM[50004][SD_STATUS] supongo que estará mal, pero era mi forma de indicarle que la tabla que voy a intentar usasr STATUS_SP esta dentro de SD_STATUS.
Un saludo y gracias!
Debes reemplazar en update tabla por el nombre de tu tabla, si se llama Facturas debe ser 'UPDATE FACTURAS', lo de las columnas y descripciones eso es según tu lógica y que es lo quieres validar, no conozco tus tablas o datos por lo que eso lo dejo genérico para que tu le pongas los datos según tu escenario.
Cualquier duda o comentario házmelo saber.
Lo siento por ser pesado pero es que no tengo ni idea de programar en este lenguaje... para aclararte te diré que estoy usando dos tablas no sólo una...
Una tabla es AM_ACTION que es la que tiene que ver con una acción que al pinchar en un icono de mi programa cambia.. y pasa de un estado a el estado "procesamiento del service desk" y lo que hay que hacer cuando pasa eso es ya en otra tabla que se llama SD_STATUS cambiar el campo STATUS_SP de Nuevo a En Procesamiento.
Si no me entiendes lo entenderé porque me explico a lo mejor mal, y ademas soy muy negado y cerraría de todas formas la pregunta, pero muchas gracias por tu atención..
Un saludo!
Veamos:
alter trigger [e_actualizar] on [50004].[am_action]
for insert,update
as
begin
    if update (start_date_ut)
    begin
        if exists(select count(*) from inserted where action_label_sp='intervención service desk') /*tratamiento service desk con el requalification*/
        begin
            update SD_STATUS
        set status_sp='en tramitacion' from [50004].[sd_status]            
        where id in (select id from inserted)  -- aca debes usar las columnas q uses para hacer join entre estas dos tablas
        end
    end
end
No te preocupes que todos hemos comenzado así, si sigues con dudas me las envías.
Muchas gracias, mañana lo pruebo que ya no estoy en el trabajo y te comento que tal me ha ido :)
Ok, a la espera de tus comentarios.
Por más que lo intento no hay manera.. me he dado cuenta que donde ponía inserted tenia que poner la tabla.. es decir en el párrafo:
if exists(select count(*) from inserted where action_label_sp='intervención service desk')
Cambie inserted por la tabla AM_ACTION_TYPE y ya me ha dejado avanzar...
Pero la ultima linea no la entiendo...
where id in (select id from inserted)
¿Qué tengo que cambiar, id e inserted?
Yo probé con:
where status_id in (select 12 from SD_STATUS)
Y me aparece ahora este error:
Mens 208, Nivel 16, Estado 6, Procedimiento e_actualizar, Línea 10Invalid object name 'e_actualizar'.
Gracias por todo.
Sorry, he tenido mucho que hacer.
Dime, ¿sigues aun con el error?
Si si.. si soy un negado lo siento.. aun no supe como resolverlo. Creo que la clave puede estar en la linea que te comento en el mensaje anterior. Y no te preocupes si tardas, lo veo normal y más en estas fechas, bastante estas haciendo ya. Mil gracias :)
Puedes poner el código completo de tu trigger, e indicarme cuales son las tablas relacionadas.
/*
    Trigger: E_ACTUALIZAR_RESPONSABLE_ESTADO
    Funcionalidad: Actualiza el responsable de la incidencia cuando un agente de soporte de nivel 1 le
transfiere a otra persona la incidencia para que la resuelva. Y también actualiza el estado de Nuevo a En tramitación
cuando se coge la incidencia.
*/
alter trigger [e_actualizar] on [50004].[am_action]
for insert,update
as
begin
    if update (start_date_ut)
    begin
        if exists(select count(*) from AM_ACTION_TYPE where action_label_sp='Intervención service Desk')
        begin
            update SD_STATUS
        set status_sp='en tramitacion' from [50004].[sd_status]            
        where status_id in (select 12 from SD_STATUS)
        end
    end
end
Debo tener algo mal seguro en where status_id....
Casi te pediría que no te fijaras mucho en el trigger hasta ahora porque fijo que hay cosas mal y que intentes entender lo que te diré a continuación, que si vas paso por paso yo creo que es entendible para alguien que sabe de esto como tú.
Voy a intentar explicartelo de manera clara lo que quiero, a ver si me hago entender jaja
Hay una tabla que es AM_ACTION que es en la que cuando se cambia el start_date_ut hay que realizar dos acciones... pero que aun no conseguí hacer la primera, con hacer una al menos me conformaría.
Antes de realizar las dos acciones se tiene que cumplir lo siguiente: que cuando en la tabla AM_ACTION_TYPE la id (ACTION_TYPE_ID) sea la 34 que es la que corresponde a NAME_SP='Tratamiento Service Desk con Recategorización' pues que se empiecen a trabajar con los cambios.
AM_ACTION y AM_ACTION_TYPE estan relacionadas deduzo por ese ACTION_TYPE_ID=34
Entonces ya simplemente una vez cumplidos estos dos requisitos habría que cambiar en la tabla  SD_REQUEST el STATUS_ID que está en  otra tabla (SD_STATUS) que tiene entre muchos valores los que quiero cambiar entre si: quiero pasar el STATUS_SP="Nuevo" al STATUS_SP="En tramitación" y estos estados corresponden al STATUS_ID=22 y 12 respectivamente. Es decir querría cambiar el STATUD_ID 22 por el 12.. de la tabla SD_STATUS... y que el cambio se viera reflejado en SD_REQUEST.
Luego la segunda parte ya podría hacerla yo casi con toda seguridad, porque es exactamente lo mismo pero con otra cosa. Así que si me pudieras resolver como tengo que escribir esto para esta primera y fundamental parte te lo agradecería eternamente.
El problema que ahora tengo es que si que me corre ya más prisa, tendría que tenerlo antes del miércoles, pero claro ya bastante estás haciendo con todo lo que me estás ayudando. Yo por mi parte mañana también le dedicaré tiempo a esto (no pienses que vagueo, lo que pasa es que tengo que hacer miles de cosas más del proyecto y justo esta parte de SQL es la que yo no tenia ni idea y mientras intento avanzar con otras cosas).
Mil gracias de antemano.
Hola,
¿Hay algo que no te quedo claro de lo que te puse en el último mensaje? A lo mejor al ser tan largo te asusté... si pudieras mirármelo te lo agradecería mucho porque me corre ahora mucha prisa y si te soy sincero yo sigo sin saberlo hacer. Muchas gracias.
Estuve de vacaciones, recién me reintegro.
Con respecto a tu problema, lo estoy revisando, necesito lo siguiente:
- Estructura o por lo menos el ID de la tabla AM_ACTION
Ademas, creo q ya no seria necesario preguntar en AM_ACTION_TYPE ya que puedes hacerlo directamente sobre AM_ACTION preguntando si el ACTION_TYPE_ID=34
Enviame lo que te solicito para poder ayudarte, si lo haces rapido lo puedo ver ahora que estoy algo libre.
Buenas crack, feliz año!
El Id de la tabla AM_ACTION es ACTION_ID
Un saludo y gracias!
Revísalo y pruébalo, me avisas como te va, espero que funcione.
create trigger [e_actualizar] on [50004].[am_action]
for update -- solo es por update, ya que cuando es insert se agrega como nuevo, segun leo tu logica, en caso me equivoque me avisas para corregirlo
as
begin
    declare @ACTION_TYPE_ID int
    set @ACTION_TYPE_ID= 0
    --Averiguamos si cambio o no start_date_ut
    if exists(select count(*) from inserted a inner join deleted b on a.ACTION_ID = b.ACTION_ID where a.start_date_ut<> b.start_date_ut)
    begin -- si existe significa que si cambio start_date_ut
        -- caputuramos el ACTION_TYPE_ID
        select    @ACTION_TYPE_ID= action_type_id from inserted
        if @ACTION_TYPE_ID= 34
        begin
            update    SD_REQUEST
            set        STATUD_ID= 12
            from    SD_REQUEST a inner join inserted b on a.ACTION_ID= b.ACTION_ID --asumo que se relacionan por esta columna
            where    b.STATUD_ID= 22
        end
    end
end
Me salen estos dos errores:
Mens 207, Nivel 16, Estado 1, Procedimiento e_actualizar, Línea 16 Invalid column name 'ACTION_ID'.
Mens 207, Nivel 16, Estado 1, Procedimiento e_actualizar, Línea 17 Invalid column name 'STATUS_ID'.
Si quito el b. de delante de status_id ya no me sale el error segundo.
Y el primero debe de ser porque no las relaciona. Es que no se exactamente que hace esa parte, ¿cómo intentas relacionarlas? ¿Y el que intentas relacionar?
Muchas gracias y siento ser tan negado..
Línea 16 Invalid column name 'ACTION_ID' --> Aca debes poner el ID que relaciona a las tablas SD_REQUEST y AM_ACTION, la informacion que se actualizo en AM_ACTION se encuentra en la tabla inserted
Línea 17 Invalid column name 'STATUS_ID'--> Error mio, debe ser: where    a.STATUD_ID= 22
No te puedes imaginar lo que te quiero! jaja eres un crack tío.. ya me funciona... y todo gracias a ti.
Al final me fije y el campo que tenían común no era el action_id sino el request_id... y ya cambiando eso, y lo del a.status_id ya va de lujo.
La primera parte está completada, mañana intento la segunda que parecía más sencilla la de cambiar el responsable de la incidencia. Y si no lo consigo ya se a quien acudir. Un saludo muy grande y te agradezco eternamente toda la paciencia y altruismo que has tenido. :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas