Usuário com melhor resposta
Trigger de update SQL Server

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/
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
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
-
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
http://luisgustavo12.wordpress.com/
-
-
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
-
A coluna CPF é unique?
Esse código está sendo executado na trigger Instead of Update?
Assinatura: http://www.imoveisemexposicao.com.br
http://luisgustavo12.wordpress.com/
-
-
A coluna Usuario_Dominio é onde é gravado o login?
sim
Assinatura: http://www.imoveisemexposicao.com.br
http://luisgustavo12.wordpress.com/
-
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
-
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'.
-
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
-
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
-