none
Trigger de update SQL Server RRS feed

  • Pergunta

  • Galera preciso fazer uma trigger update para bloquear dados duplicados em uma tabela "Usuario", tipo tenho um campo de login que não pode ser chave primaria e nem unique, esse login pode ser editado, então preciso que essa trigger antes de executar o update verifique se não há outros login iguais ao que está sendo editado, alguem pode ajudar ?

    tentei com o codigo abaixo, mais ao editar o registro que possui login ele pega o mesmo que está sendo editado e acusa como duplicado, e quando tento editar um usuario que ainda não tem login (ou seja está null) ele não exibe erro mas também não valida nenhuma alteração

    CREATE TRIGGER trgCadastraUsuario ON usuario
    INSTEAD OF INSERT
    AS
    BEGIN
        IF EXISTS (SELECT * FROM usuario As usu
            INNER JOIN INSERTED As I ON usu.USUARIO_DOMINIO= I.USUARIO_DOMINIO)
        BEGIN
            RAISERROR('REGISTRO DUPLICADO',16,1)
            ROLLBACK
            RETURN
        END
    END


    http://luisgustavo12.wordpress.com/

    quinta-feira, 5 de junho de 2014 16:16

Respostas

  • GuSouza,

    Por que você esta utilizando um Trigger Instead Of?

    Outra coisa, isso pode até ser implementado no Banco, mas eu particularmente acho mais indicado ser feito na aplicação.

    Veja se este exemplo pode te ajudar:

    CREATE TRIGGER MyTrigger ON dbo.MyTable
    AFTER INSERT
    AS
    
    if exists ( select * from table t 
        inner join inserted i on i.name=t.name and i.date=t.date)
    begin
        rollback
        RAISERROR ('Duplicate Data', 16, 1);
    end
    go


    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]

    • Marcado como Resposta GuSouza segunda-feira, 9 de junho de 2014 14:16
    sexta-feira, 6 de junho de 2014 17:35

Todas as Respostas

  • Boa tarde,

    Não entendi o problema ao inserir, mas para evitar o problema ao alterar experimente adicionar uma condição para verificar se o ID do usuário é diferente. Ex:

    WHERE usu.IDUsuario <> i.IDUsuario

    obs: essa condição não é necessário ao inserir, mas não deve provocar problema caso seja adicionada

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 5 de junho de 2014 17:02
  • Boa tarde,

    Não entendi o problema ao inserir, mas para evitar o problema ao alterar experimente adicionar uma condição para verificar se o ID do usuário é diferente. Ex:

    WHERE usu.IDUsuario <> i.IDUsuario

    obs: essa condição não é necessário ao inserir, mas não deve provocar problema caso seja adicionada

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    Obrigado por responder, o problema é o seguinte tenho uma tabela usuario que possui uma coluna login, que é utilizado para logar em um sistema, nem todo mundo tem esse login(quem nao tem login fica como null), esse login é editavel, ao editar a tabela usuario preciso verificar se o conteudo da coluna login que está sendo inserido já existe no banco, ao editar por exemplo a senha de um usuario que ja tem login gera o primeiro erro dizendo que existem dados duplicados, mas na verdade ele compara  com si mesmo. meio confuso mas é basicamente isso, o outro problema é que ele não está salvando as alterações.

    http://luisgustavo12.wordpress.com/

    quinta-feira, 5 de junho de 2014 17:14
  •   IF EXISTS (SELECT * FROM usuario As usu
            INNER JOIN INSERTED As I ON usu.USUARIO_DOMINIO= I.USUARIO_DOMINIO WHERE usu.CPF<> i.CPF)
    Fiz assim e o problema continua

    http://luisgustavo12.wordpress.com/

    quinta-feira, 5 de junho de 2014 17:21
  • A coluna CPF é unique?

    Esse código está sendo executado na trigger Instead of Update?

    A coluna Usuario_Dominio é onde é gravado o login?


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex quinta-feira, 5 de junho de 2014 17:42
    quinta-feira, 5 de junho de 2014 17:40
  • A coluna CPF é unique?

    Esse código está sendo executado na trigger Instead of Update?


    Assinatura: http://www.imoveisemexposicao.com.br

    sim.

    http://luisgustavo12.wordpress.com/

    quinta-feira, 5 de junho de 2014 17:42
  • A coluna Usuario_Dominio é onde é gravado o login?

    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 5 de junho de 2014 17:45
  • A coluna Usuario_Dominio é onde é gravado o login?

    Assinatura: http://www.imoveisemexposicao.com.br

    sim

    http://luisgustavo12.wordpress.com/

    quinta-feira, 5 de junho de 2014 17:54
  • Desculpe mas não estou entendendo... acho que a mensagem de erro deveria ser exibida somente se o Usuario_Dominio é igual e o CPF diferente, o que excluiria o próprio usuário alterado (o CPF seria igual).


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 5 de junho de 2014 18:16
  • Acho que esta dando problema porque você esta fazendo select em tudo, você precisa de todos os campos?

    Se precisar validar apenas o campo login, coloque só ele.

    IF EXISTS (SELECT usu.login FROM usuario As usu INNER JOI......


    Se a resposta foi útil marcar 'como resposta'.

    quinta-feira, 5 de junho de 2014 21:40
  • GuSouza,

    Por que você esta utilizando um Trigger Instead Of?

    Outra coisa, isso pode até ser implementado no Banco, mas eu particularmente acho mais indicado ser feito na aplicação.

    Veja se este exemplo pode te ajudar:

    CREATE TRIGGER MyTrigger ON dbo.MyTable
    AFTER INSERT
    AS
    
    if exists ( select * from table t 
        inner join inserted i on i.name=t.name and i.date=t.date)
    begin
        rollback
        RAISERROR ('Duplicate Data', 16, 1);
    end
    go


    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]

    • Marcado como Resposta GuSouza segunda-feira, 9 de junho de 2014 14:16
    sexta-feira, 6 de junho de 2014 17:35
  • GuSouza,

    Tente desta forma:

    CREATE TRIGGER trgCadastraUsuario ON usuario
    INSTEAD OF INSERT
    AS
    BEGIN

    --- Verifica se está duplicado e depois faz o insert

    IF (NOT EXIXTS (SELECT P.login FROM usuario P, inserted I
            Where P.login = I.login))
    INSERT INTO usuario
            SELECT login
            FROM inserted
    --- Se estiver duplicado, exibe mensagem
    ELSE
            RAISERROR('REGISTRO DUPLICADO',16,1)
            ROLLBACK
            RETURN
    END

    sexta-feira, 6 de junho de 2014 20:22
  • Corrigindo a linha: 
    IF (NOT EXISTS (SELECT P.login FROM usuario P, inserted I

    sexta-feira, 6 de junho de 2014 20:23