none
Criar Trigger RRS feed

  • Pergunta

  • Boa noite

    Preciso criar uma trigger, onde tudo que for inserido e bater com a consulta abaixo,seja feito um update.

    SELECT * FROM t1 JOIN t2 ON t1.c1= t2.c2 WHERE t1.c1= 'xxx' and t2.c2= 'yyyy' 

    Obs: Os valores dos campos do select 'xxx' e 'yyyy' são fixos ou seja serão sempre os mesmos.

    quarta-feira, 5 de junho de 2019 00:16

Respostas

  • AndreHz,

    O merge é comando adicionado a partir da versão 2008 que tem justamente a finalidade de analisar as condições com base nas definições aplicadas a ele, realizando operações de inserção, atualização ou exclusão em uma tabela de destino usando os resultados de uma união com uma tabela de origem.

    Veja este exemplo: 

    CREATE TABLE Pessoas(Id INT PRIMARY KEY IDENTITY, Nome NVARCHAR(100) NOT NULL)
    GO
    
    CREATE TABLE PessoasHistorico(Id INT NOT NULL,Nome VARCHAR(50) NOT NULL,Data SMALLDATETIME NOT NULL DEFAULT GETDATE(),Situacao VARCHAR(12) NOT NULL)
    go
    
    INSERT INTO Pessoas (Nome) VALUES('Marcela Leal')
    INSERT INTO Pessoas (Nome) VALUES('Tiago Péricles Guimarães')
    INSERT INTO Pessoas (Nome) VALUES('Rodrigo Costa')
    INSERT INTO Pessoas (Nome) VALUES('Fernanda Lima')
    INSERT INTO Pessoas (Nome) VALUES('Helena Silva')
    INSERT INTO Pessoas (Nome) VALUES('Raimundo Nonato')
    INSERT INTO Pessoas (Nome) VALUES('Virgínia Costa dos Santos')
    INSERT INTO Pessoas (Nome) VALUES('Mário Souza Andrade')
    GO
    
    
    ALTER TABLE Pessoas ADD Data SMALLDATETIME NOT NULL DEFAULT GETDATE()
    go
    
    MERGE PessoasHistorico AS PH
     USING Pessoas AS P 
            ON P.Id = PH.Id
    WHEN NOT MATCHED BY TARGET THEN
     INSERT ([Id], [Nome], [Data], [Situacao])
     VALUES (Id, Nome, Data, 'Inserido')
    WHEN NOT MATCHED BY SOURCE THEN
     UPDATE SET PH.Situacao = 'Apagado', PH.Data = GETDATE();
    go
    
    select * from Pessoas
    select * from PessoasHistorico
    

    Você pode com base na condição aplicada ao comando Merge, definir a ocorrência do Insert, Update ou Delete.

    Importante destacar que o comando Merge, aplica a análise condicional linha a linha, dependendo do volume de dados poderemos nos deparar com impactos de processamento.

    Mesmo assim, eu montei um Código meio louco aqui para uso do trigger, é somente uma ideia, um esboço, temos muito a melhorar, talvez te ajude:

    Create Table Tabela1
    (Codigo Int,
     ValoresXXX Int,
     ValoresYYY Int)
    Go
    
    Create Table Tabela2
    (Codigo Int,
     ValoresXXX Int,
     ValoresYYY Int)
    Go
    
    Insert Into Tabela1 Values (1,10,100),(2,20,200),(3,30,300)
    Go
    
    Insert Into Tabela2 Values (1,10,100),(2,20,200),(3,30,300)
    Go
    
    Create Trigger T_InserirTabela1
    On Tabela1
    After Insert
    As
    Begin
    
     Declare @Codigo Int, @ValoresXXXNovo Int, @ValoresYYYNovo Int
    
     Select @Codigo = Codigo,
            @ValoresXXXNovo = ValoresXXX,
            @ValoresYYYNovo = ValoresYYY
     From inserted
    
    
     If (((Select ValoresXXX From Tabela1 Where Codigo = @Codigo) = @ValoresXXXNovo) And (Select ValoresYYY From Tabela1 Where Codigo = @Codigo) = @ValoresYYYNovo)
      Begin
       Update Tabela2
       Set ValoresXXX = @ValoresXXXNovo,
           ValoresYYY = @ValoresYYYNovo
       Where Codigo = @Codigo
     End
    End

    Eu não testei de verdade, não sei se vai funcionar da maneira que você deseja.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 5 de junho de 2019 01:05

Todas as Respostas

  • Andrehz,

    Será feito um Update aonde? Na mesma tabela?

    Seria um trigger somente para o evento de Insert?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 5 de junho de 2019 00:30
  • Opa Junior ...

    Será feito um update na T2

    UPDATE T2 SET X=Y  WHERE c2= 'yyyy'

    Sim, só quando um dado for inserido na tabela.

    Muito obrigado, desde já.



    • Editado Andrehz quarta-feira, 5 de junho de 2019 00:44
    quarta-feira, 5 de junho de 2019 00:40
  • Andrehz,

    Você já pensou em utilizar o comando Merge?

    Qual é a versão do seu SQL Server?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 5 de junho de 2019 00:50
  • Não, pensei na trigger, pois a cada registro inserido, preciso fazer a consulta e talvez o update, como funciona o merge?

    Uso o sql 2008.

    quarta-feira, 5 de junho de 2019 00:54
  • AndreHz,

    O merge é comando adicionado a partir da versão 2008 que tem justamente a finalidade de analisar as condições com base nas definições aplicadas a ele, realizando operações de inserção, atualização ou exclusão em uma tabela de destino usando os resultados de uma união com uma tabela de origem.

    Veja este exemplo: 

    CREATE TABLE Pessoas(Id INT PRIMARY KEY IDENTITY, Nome NVARCHAR(100) NOT NULL)
    GO
    
    CREATE TABLE PessoasHistorico(Id INT NOT NULL,Nome VARCHAR(50) NOT NULL,Data SMALLDATETIME NOT NULL DEFAULT GETDATE(),Situacao VARCHAR(12) NOT NULL)
    go
    
    INSERT INTO Pessoas (Nome) VALUES('Marcela Leal')
    INSERT INTO Pessoas (Nome) VALUES('Tiago Péricles Guimarães')
    INSERT INTO Pessoas (Nome) VALUES('Rodrigo Costa')
    INSERT INTO Pessoas (Nome) VALUES('Fernanda Lima')
    INSERT INTO Pessoas (Nome) VALUES('Helena Silva')
    INSERT INTO Pessoas (Nome) VALUES('Raimundo Nonato')
    INSERT INTO Pessoas (Nome) VALUES('Virgínia Costa dos Santos')
    INSERT INTO Pessoas (Nome) VALUES('Mário Souza Andrade')
    GO
    
    
    ALTER TABLE Pessoas ADD Data SMALLDATETIME NOT NULL DEFAULT GETDATE()
    go
    
    MERGE PessoasHistorico AS PH
     USING Pessoas AS P 
            ON P.Id = PH.Id
    WHEN NOT MATCHED BY TARGET THEN
     INSERT ([Id], [Nome], [Data], [Situacao])
     VALUES (Id, Nome, Data, 'Inserido')
    WHEN NOT MATCHED BY SOURCE THEN
     UPDATE SET PH.Situacao = 'Apagado', PH.Data = GETDATE();
    go
    
    select * from Pessoas
    select * from PessoasHistorico
    

    Você pode com base na condição aplicada ao comando Merge, definir a ocorrência do Insert, Update ou Delete.

    Importante destacar que o comando Merge, aplica a análise condicional linha a linha, dependendo do volume de dados poderemos nos deparar com impactos de processamento.

    Mesmo assim, eu montei um Código meio louco aqui para uso do trigger, é somente uma ideia, um esboço, temos muito a melhorar, talvez te ajude:

    Create Table Tabela1
    (Codigo Int,
     ValoresXXX Int,
     ValoresYYY Int)
    Go
    
    Create Table Tabela2
    (Codigo Int,
     ValoresXXX Int,
     ValoresYYY Int)
    Go
    
    Insert Into Tabela1 Values (1,10,100),(2,20,200),(3,30,300)
    Go
    
    Insert Into Tabela2 Values (1,10,100),(2,20,200),(3,30,300)
    Go
    
    Create Trigger T_InserirTabela1
    On Tabela1
    After Insert
    As
    Begin
    
     Declare @Codigo Int, @ValoresXXXNovo Int, @ValoresYYYNovo Int
    
     Select @Codigo = Codigo,
            @ValoresXXXNovo = ValoresXXX,
            @ValoresYYYNovo = ValoresYYY
     From inserted
    
    
     If (((Select ValoresXXX From Tabela1 Where Codigo = @Codigo) = @ValoresXXXNovo) And (Select ValoresYYY From Tabela1 Where Codigo = @Codigo) = @ValoresYYYNovo)
      Begin
       Update Tabela2
       Set ValoresXXX = @ValoresXXXNovo,
           ValoresYYY = @ValoresYYYNovo
       Where Codigo = @Codigo
     End
    End

    Eu não testei de verdade, não sei se vai funcionar da maneira que você deseja.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 5 de junho de 2019 01:05
  • Muito obrigado pela sua ajuda.
    quarta-feira, 5 de junho de 2019 01:08