none
SQL Inserir em Cascata RRS feed

  • Pergunta

  • Existe a possibilidade de fazer um inserção em cascata no SQL?

    No exemplo abaixo eu tenho a tabela Documento e a tabela Revisão, toda vez que eu inserir uma instancia na tabela Documento, automaticamente deve ser criada uma instancia de Revisão "inicial" para essa instancia de documento.

    Existe algo como inserção em cascata no SQL?

    quarta-feira, 28 de março de 2018 18:15

Respostas

  • Naiara via banco de dados , vc pode usar Procedure 

    seque um exemplo no link

    https://stackoverflow.com/questions/5762942/stored-procedure-to-insert-two-tables-with-relationship

    ou se preferir via trigger,  seque outro exemplo 

    https://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    • Marcado como Resposta NAYARA_FJ quarta-feira, 28 de março de 2018 19:13
    quarta-feira, 28 de março de 2018 18:58
  • NAYARA_FJ ,dessa forma que vc fez sua trigger está inconsistente, eu te aconselho fazer via Procedure,

    ela só vai funcionar corretamente se for apenas um insert , se for um batch ela vai se comportar de outra forma 

    seque uma sugestão de mudança

    CREATE TRIGGER RevInitial
    ON dbo.Documento
    AFTER INSERT
    AS
    BEGIN
    
    
    
        INSERT INTO Revisao (Campo1,
                             Campo2)
        SELECT I.Campo1,
               I.Campo2
          FROM INSERTED I;
    END;
    GO

    caso queira fazer via Trigger , por favor leia os artigos do Mestre José Diz

    https://social.technet.microsoft.com/wiki/pt-br/contents/articles/38010.armadilhas-na-programacao-de-procedimentos-de-gatilho.aspx

    E se possivel veja os videos de trigger do canal do gustavo Maia no youtube

    https://www.youtube.com/watch?v=3VCl6wFn3yc

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    • Marcado como Resposta NAYARA_FJ quinta-feira, 29 de março de 2018 10:17
    quarta-feira, 28 de março de 2018 19:29

Todas as Respostas

  • Naiara via banco de dados , vc pode usar Procedure 

    seque um exemplo no link

    https://stackoverflow.com/questions/5762942/stored-procedure-to-insert-two-tables-with-relationship

    ou se preferir via trigger,  seque outro exemplo 

    https://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    • Marcado como Resposta NAYARA_FJ quarta-feira, 28 de março de 2018 19:13
    quarta-feira, 28 de março de 2018 18:58
  • Olá!

    Eu consegui fazer essa trigger,

    CREATE TRIGGER RevInitial ON [Documento] AFTER INSERT AS 
    INSERT INTO Revisao (CodDocumento) VALUES (1);

    Como posso recuperar o codDoc da tabela Documento e inserir em CodDocumento da tabela revisão?

    Eu coloquei 1 pra testar. Não estou sabendo recuperar esse valor

    quarta-feira, 28 de março de 2018 19:07
  • Consegui!

    CREATE TRIGGER RevInitial ON [Documento] AFTER INSERT AS 
    BEGIN
        DECLARE
        @CodDoc INT
        SELECT @CodDoc = CodDoc FROM INSERTED
        INSERT INTO Revisao (CodDocumento) VALUES (@CodDoc);
    END
    GO

    Muito obrigada!


    • Editado NAYARA_FJ quarta-feira, 28 de março de 2018 19:15
    quarta-feira, 28 de março de 2018 19:13
  • NAYARA_FJ ,dessa forma que vc fez sua trigger está inconsistente, eu te aconselho fazer via Procedure,

    ela só vai funcionar corretamente se for apenas um insert , se for um batch ela vai se comportar de outra forma 

    seque uma sugestão de mudança

    CREATE TRIGGER RevInitial
    ON dbo.Documento
    AFTER INSERT
    AS
    BEGIN
    
    
    
        INSERT INTO Revisao (Campo1,
                             Campo2)
        SELECT I.Campo1,
               I.Campo2
          FROM INSERTED I;
    END;
    GO

    caso queira fazer via Trigger , por favor leia os artigos do Mestre José Diz

    https://social.technet.microsoft.com/wiki/pt-br/contents/articles/38010.armadilhas-na-programacao-de-procedimentos-de-gatilho.aspx

    E se possivel veja os videos de trigger do canal do gustavo Maia no youtube

    https://www.youtube.com/watch?v=3VCl6wFn3yc

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    • Marcado como Resposta NAYARA_FJ quinta-feira, 29 de março de 2018 10:17
    quarta-feira, 28 de março de 2018 19:29
  • Olá muito obrigada, depois com mais calma irei ler esses artigos que me indicou.

    Eu sou nova com Banco de dados. Eu preferi fazer com Trigger mesmo devido a estrutura do código do meu programa. Mas gostei dessa outra opção, vou analisar melhor depois.

    Eu precisava colocar o código da revisão vigente na tabela de documentos, fiz correto?

    ALTER TRIGGER RevInitial
    ON dbo.Documento
    AFTER INSERT
    AS
    DECLARE @CodRev TABLE (CodD INT, CodR INT)
    BEGIN
        INSERT INTO Revisao (CodDocumento)
    	OUTPUT INSERTED.CodRev, INSERTED.CodDocumento INTO @CodRev(CodR, CodD)
        SELECT I.CodDoc
        FROM INSERTED I;
    END;
    
    BEGIN
        UPDATE dbo.Documento
    	SET CodRev = p.CodR
    	FROM @CodRev p
    	WHERE p.CodD = Documento.CodDoc
    END;
    GO

    quinta-feira, 29 de março de 2018 11:31
  • Deleted
    quinta-feira, 29 de março de 2018 14:06
  • Em relação a Cod Cliente é proposital sim é um controle de documento na área de engenharia e projeto, então um documento normalmente possui 3 números, as vezes 4.<o:p></o:p>

    Em relação a revisão, eu estou pensando ainda porque vou ter a opção também de descer revisão. Se eu for manter um histórico de revisão eu preciso desse campo, caso eu desça revisão deletando a revisão, ai eu posso eliminar esse campo, estou analisando ainda a melhor opção e se há necessidade de manter um histórico nesse caso. <o:p></o:p>

    Em relação a chave composta eu ainda não sei quando é que se aplicar. Tenho que dar uma estudada nesse ponto. <o:p></o:p>

    quinta-feira, 29 de março de 2018 16:18
  • Deleted
    quinta-feira, 29 de março de 2018 21:19
  • Deleted
    sexta-feira, 30 de março de 2018 10:50
  • Olá muito obrigada pelos esclarecimentos, segunda feira vou tentar corrigir os erros. 

    "O que significa "descer a versão"?"

    Esse caso aconteceria mais por erro do usuário acho, então vou deletar a linha da ultima revisão nesse caso.

    Se um documento é novo, ele já tem revisão?!

    Teoricamente a revisão é 0, mas nesse caso vou ter minhões de linhas de revisão a toa né? Isso pode impactar no desempenho do banco futuramente, acho que vou tratar isso de outra maneira.

    sexta-feira, 30 de março de 2018 13:31