Usuário com melhor resposta
Criar Trigger

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.
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]
- Marcado como Resposta Andrehz quarta-feira, 5 de junho de 2019 01:08
- Editado Junior Galvão - MVPMVP quarta-feira, 5 de junho de 2019 01:09
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]
-
-
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]
-
-
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]
- Marcado como Resposta Andrehz quarta-feira, 5 de junho de 2019 01:08
- Editado Junior Galvão - MVPMVP quarta-feira, 5 de junho de 2019 01:09
-