none
Trigger para incluir em outra tabela de outro banco de dados do mesmo servidor RRS feed

  • Pergunta

  • Bom dia Pessoal,

    Li várias explicações sobre trigger, mas não consegui entender muito bem e montar a trigger que preciso.

    Estamos trocando o ERP da empresa. Foi feita uma migração de dados para a base do novo ERP. Porem ficaremos utilizando os dois erps por algum tempo

    Preciso dar manutenção (inclusão) no cadastro de cliente, por exemplo, nos dois erps.

    Preciso de uma trigger que, após incluído o cliente no ERP_Atual, dispare uma inclusão para o ERP_Novo.

    Os dois bancos de dados (ERP_Atual e ERP_Novo) estão no mesmo servidor e mesma instancia do SQL.

    Abraços,


    Zagatti, Angelo Itápolis-SP

    segunda-feira, 4 de fevereiro de 2013 10:41

Respostas

  • Angelo, você não está usando a tabela inserted que é interna do SQL e possui os registros inseridos e alterados.

    Tente algo como:

    CREATE TRIGGER [dbo].[Atl_Cli] ON [dbo].[TABELA_A] FOR INSERT
    AS 
    BEGIN
        INSERT INTO tabela_b (codigo, nomecli)
        SELECT Codigo, NomeCli FROM Inserted
    END
    Essa trigger simplesmente pega qualquer registro que tenha sido inserido na tabela_A e insere na tabela_B

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Marcado como Resposta Angelo Zagatti segunda-feira, 4 de fevereiro de 2013 18:24
    segunda-feira, 4 de fevereiro de 2013 16:14

Todas as Respostas

  • Bom dia Angelo,

    Você deve criar triggers FOR INSERT na tabela do ERP_Atual, inserindo os dados no ERP_Novo.

    Dentro da trigger você pode acessar os dados inseridos no ERP_Atual através da tabela "inserted" e aí fazer um INSERT... SELECT para o ERP_Novo. Algo como

    INSERT INTO ERP_Novo..MinhaTabela
    (campo1, campo2, campo2)
    SELECT campo1, campo2, campo3
    FROM Inserted

    Espero ter ajudado.

    []'s


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 4 de fevereiro de 2013 11:29
  • Oi Mariana,

    Obrigado pela ajuda, ajudou mas ainda nao sei como fazer essa trigger.

    Tentei assim:

    CREATE TRIGGER [dbo].[Atl_Cli] ON [dbo].[TABELA_A] FOR INSERT
    AS
    BEGIN
        DECLARE @CODIGO BIGINT
        declare @NOME VARCHAR(50)
        SET @CODIGO = (select CODIGO from tabela_a)
        set @NOME = (select nome from tabela_a)
        INSERT INTO TABELA_B (CODIGO, NOMECLI) VALUES (@CODIGO, @NOME)
        SET NOCOUNT ON;
    END

    Quando executo pela 1ª vez a linha baixo, funciona.

    insert into TABELA_A (CODIGO,NOME) Values (1,'AAAAAAAAAAA')

    (1 row(s) affected)

    (1 row(s) affected)

    mas quando executo pela 2ª vez, tenho o erro abaixo

    insert into TABELA_A (CODIGO,NOME) Values (2,'BBBBBBBBB')

    Msg 512, Level 16, State 1, Procedure Atl_Cli, Line 7
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.

    Voce poderia por favor dar um exemplo ?

    Obrigado.


    Zagatti, Angelo Itápolis-SP

    segunda-feira, 4 de fevereiro de 2013 15:09
  • Zagatti,

    Você esta executando uma subquery que esta retornando mais de linha de registros, e isso não é possível quando se utiliza o operador de igual.

    Verifique estes dois selects:

    SET @CODIGO = (select CODIGO from tabela_a)
    set @NOME = (select nome from tabela_a)
    Provavelmente você possui registros com o mesmo código ou nome e isso esta gerando o erro.
    



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 4 de fevereiro de 2013 15:33
  • Angelo, você não está usando a tabela inserted que é interna do SQL e possui os registros inseridos e alterados.

    Tente algo como:

    CREATE TRIGGER [dbo].[Atl_Cli] ON [dbo].[TABELA_A] FOR INSERT
    AS 
    BEGIN
        INSERT INTO tabela_b (codigo, nomecli)
        SELECT Codigo, NomeCli FROM Inserted
    END
    Essa trigger simplesmente pega qualquer registro que tenha sido inserido na tabela_A e insere na tabela_B

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    • Marcado como Resposta Angelo Zagatti segunda-feira, 4 de fevereiro de 2013 18:24
    segunda-feira, 4 de fevereiro de 2013 16:14
  • Obrigado Junior,

    Obrigado Mariana, fiz exatamente como seu exemplo e deu tudo certo.

    Abraços,


    Zagatti, Angelo Itápolis-SP

    segunda-feira, 4 de fevereiro de 2013 18:24