none
Trigger RRS feed

  • Pergunta

  • Boa tarde amigos,

    É possível criar uma trigger onde ao inserir ou deletar dados A ela verifique antes se um determinado campo  dessa tabala foi preenchido (ex: status), e se estiver preenchido abre uma consulta pegando um campo id da tabela A, jogando nessa consulta e o resultado dessa consulta inserindo ou deletando da tabela C?

    Como ficaria essa trigger?



    • Editado Leandro HG sexta-feira, 26 de julho de 2019 20:10
    sexta-feira, 26 de julho de 2019 20:06

Respostas

Todas as Respostas

  • Deleted
    sexta-feira, 26 de julho de 2019 22:32
  • Leandro,

    Então, sinceramente falando eu fiquei perdido na maneira que os dados tem que ser inseridos, o nível de dependência e relacionamento caso exista.

    Além disso, esta questão de pegar o código da TabelaA e inserir ou deletar na TabelaC foi o que eu entendi, sendo assim, elaborei um código de exemplo, repito é somente exemplo:

    -- Criando a Tabela A -- Create Table TabelaA (Codigo Int Identity(1,1) Primary Key, Produto Char(5), Data Date, Quantidade Int, Status Char(1)) Go -- Criando a Tabela B -- Create Table TabelaB (Codigo Int Identity(1,1) Primary Key, Ferramenta Char(5), Material Char(5)) Go -- Criando a Tabela C -- Create Table TabelaC (Codigo Int, Produto Char(5), Data Date, Quantidade Int, Ferramenta Char(5), Material Char(5)) Go -- Inserindo Dados -- Insert Into TabelaA (Produto, Data, Quantidade, Status) Values ('A',GetDate(),10,'P'), ('B',GetDate(),20,'N'), ('C',GetDate(),30,Null) Go Insert Into TabelaB (Ferramenta, Material) Values ('F1','M1'), ('F2','M2'), ('F3','M3') Go -- Criando a Trigger -- Create Trigger T_TabelaA_Validar On TabelaA After Insert, Delete As Begin

    Set NoCount On

    Declare @Codigo Int 

    -- Encerrando o trigger em caso de não ocorrer manipulação de linhas --
    If (@@RowCount = 0)
    Return;

    If (Select Status From Inserted) Is Not Null Begin Set @Codigo = (Select Codigo From Inserted) Insert Into TabelaC (Codigo, Produto, Data, Quantidade, Ferramenta, Material) Select A.Codigo, A.Produto, A.Data, A.Quantidade, B.Ferramenta, B.Material From TabelaA A Inner Join TabelaB B On A.Codigo = B.Codigo
    Where A.Codigo = @Codigo End If (Select Status From Deleted) Is Not Null BEGIN Set @Codigo = (Select Codigo From Deleted) Delete From TabelaC Where Codigo = @Codigo End End -- Testando -- Insert Into TabelaB (Ferramenta, Material) Values ('F4','M4') Go Insert Into TabelaA (Produto, Data, Quantidade, Status) Values ('D',GetDate(),40,'A') Go -- Validando os dados inseridos na Tabela C -- Select * From TabelaC Go

    Peço que verifique se este exemplo te ajuda, enfatizo mais uma vez que este é somente um exemplo, não levei em consideração suas regras de negócio, analise, valide e veja se de alguma forma este cenário poderá lhe ajudar.


    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]





    • Editado Junior Galvão - MVPMVP segunda-feira, 29 de julho de 2019 22:07 Atualizando o código de exemplo, adicionado a condição para verificar o encerramento do trigger.
    sexta-feira, 26 de julho de 2019 22:45
  • Bom dia Junior,

    Na verdade é assim meu amigo, eu preciso montar essa tabela C com base nas informações da tabela A e B. Assim que o registro da tabela "A" deixar de existir eu também não vou precisar mais do registro na tabela C. Na aplicação o usuário obtém informações vindas dessas duas tabelas e complementa com mais dados, porém em um determinado ponto do processo o item da tabela A é concluído, dessa forma também não será mais necessário na tabela C.

    Também não sei bem se essa é a melhor prática...kkk, mais foi o que eu imaginei para solução.

    segunda-feira, 29 de julho de 2019 11:00
  • Leandro HG,

    Ok, então acredito que o meu exemplo, possa estar no caminho da sua necessidade, veja, análise, teste e identifique se é o que você estava precisando.

    Dizer se é a melhor solução, isso vai depender de você.

    Eu atualizei a pouco o meu exemplo, havia esquecido de adicionar a condição para encerrar o trigger caso não venham existir linhas manipuladas.


    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]


    segunda-feira, 29 de julho de 2019 11:55
  • Deleted
    • Marcado como Resposta Leandro HG terça-feira, 30 de julho de 2019 18:17
    segunda-feira, 29 de julho de 2019 12:10
  • Leandro,

    Complementado o que foi abordado anteriormente, e respeitando as opiniões, temos que analisar e considerar a possibilidade de ocorrência da manipulação de multiplas linhas de dados quando estamos implementando um Trigger DML - Data Manipulation Language.

    Entretanto é importante ressaltar e enfatizar com base na documentação oficial Microsoft, que normalmente a ocorrência da manipulação de múltiplas linhas de dados dentro da mesma transação ou instrução é um comportamento mais direcionado e com ocorrências mais comum em triggers que envolvam os comandos UPDATE e DELETE, pois essas instruções geralmente afetam várias linhas.

    O qual se analisarmos este mesmo comportamento em relação ao comando Insert é menos comum de ocorrer, pois a instrução INSERT basicamente adiciona apenas uma única linha, mesmo assim, como o gatilho INSERT pode ser acionado por uma instrução INSERT INTO (table_name) SELECT, a inserção de várias linhas pode causar a invocação de um único gatilho.

    A princípio como sua necessidade não requeria a consideração de uma análise baseada em multilinha, bem como, você não estaria realizando um cálculo de valores ou somatória que deveriam processar conjuntos de linhas para gerar subtotais ou totais parciais não levei em consideração adicionar ao meu código esta condição.

    De modo respeitoso, eu ressalto a importância desta análise, mas contradigo o que foi exposto pelo argumentador anterior "como falta experiência, erro, ou até mesmo falta de conhecimento", mas sim afirmo o que compreendo como percepção da necessidade em relação ao que foi você postou em seu dúvida inicial.

    Caso você queria saber mais sobre como construir Triggers que levam em consideração a análise e abordagem do processamento de multiplas linhas, além do link apresentado anteriormente, recomendo caso necessário o acesso ao link da documentação oficial da Microsoft Brasil: Crie gatilhos DML para tratar várias linhas de dados.

    Destaco também, que toda documentação oficial Microsoft no que se refere ao SQL Server e Azure esta sendo construída, escrita, reescrita e mantida por nós MVPs de Data Platform localizados em diversos países do mundo, algo que não representa ser 100% correto ou infalível, estamos em constante melhorias e correções.

    Outro link muito útil e que lhe poderá ajudar, relaciona-se ao próprio conceito de Gatilhos DML.


    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]



    segunda-feira, 29 de julho de 2019 23:23