none
Necesito ayuda con los triggers RRS feed

  • Pregunta

  • Supuestamente hay 2 tipos "AFTER" y "INSTEAD OF" pero para que es el "FOR"?.

    Cuando eliminas un registro se crea la tabla temporal "deleted" y cuando insertas se crea "inserted" pero cuando actualizas que pasa? si quiere acceder a los campos antiguos del registros?, es decir, aquellos campos que estaban antes de producirse la actualización?

    Agradecería unos ejemplos, saludos 

    sábado, 1 de agosto de 2015 17:24

Respuestas

  • for y after hacen lo mismo. Cuando actualizas SQL server asemeja a un delete mas un insert es decir se llenan ambas pseudotablas, delete contiene los valores antes de la actualización, inserted los posteriores.

    IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
        DROP TRIGGER Sales.reminder2;
    GO
    CREATE TRIGGER reminder2
    ON Sales.Customer
    AFTER INSERT, UPDATE, DELETE 
    AS
    begin
    if ( select count(*) from inserted=0) 
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. Deleted orderd',
            @subject = 'Reminder';
    
    if ( select count(*) from deleted=0) 
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. inserted orderd',
            @subject = 'Reminder';
    
    if (( select count(*) from inserted>0) and ( select count(*) from deleted>0) )
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. updated orderd',
            @subject = 'Reminder';
    GO


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 4 de agosto de 2015 11:00
    Moderador

Todas las respuestas

  • Hola AnalistaStr,

    Por favor, apoya a guardar orden en el foro. Ya te han mencionado que existe una sección en este foro para SQL Server donde podrás colocar todas tus dudas, este es una sección para ASP Net. En la sección SQL Server encontrarás muchos expertos gustosos en apoyarte.


    sábado, 1 de agosto de 2015 17:33
  • Hola AnalistaStr

    Como te comenta Willams Morales el foro de SQL SERVER de MSDN es 
    https://social.msdn.microsoft.com/Forums/es-ES/home?forum=sqlserveres
    Entonces pudes publicar alli tu dudas sobre esta producto/tecnologia (igualmente algun moderador moverá este post a dicho foro por tratarse de esta temantica) pero recuerda para tu proxima duda o inquietud

    Por lo pronto, puedes comenzar a leer en la ayuda de MSDN sobre Trigger que te explica 

    Donde veras que FOR es simplemente igual a AFTER, es indistinto
    (...)AFTER es el valor predeterminado cuando solo se especifica la palabra clave FOR.(...)

    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    sábado, 1 de agosto de 2015 18:50
  • Aca me responden mas rápido, allá casi nadie responde -.-
    sábado, 1 de agosto de 2015 22:58
  • for y after hacen lo mismo. Cuando actualizas SQL server asemeja a un delete mas un insert es decir se llenan ambas pseudotablas, delete contiene los valores antes de la actualización, inserted los posteriores.

    IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
        DROP TRIGGER Sales.reminder2;
    GO
    CREATE TRIGGER reminder2
    ON Sales.Customer
    AFTER INSERT, UPDATE, DELETE 
    AS
    begin
    if ( select count(*) from inserted=0) 
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. Deleted orderd',
            @subject = 'Reminder';
    
    if ( select count(*) from deleted=0) 
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. inserted orderd',
            @subject = 'Reminder';
    
    if (( select count(*) from inserted>0) and ( select count(*) from deleted>0) )
       EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'AdventureWorks2012 Administrator',
            @recipients = 'danw@Adventure-Works.com',
            @body = 'Don''t forget to print a report for the sales force. updated orderd',
            @subject = 'Reminder';
    GO


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 4 de agosto de 2015 11:00
    Moderador