none
Erro de Trigger com update, só funciona com insert RRS feed

  • Pergunta

  • Tenho a seguinte tabela

    CREATE TABLE Pessoa(
    	IdPessoa int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	Nome varchar(100) NOT NULL
    )

    Fiz uma Trigger para que não seja inserido ou atualizado um Nome com menos de 5 Caracteres, porém a trigger so funciona com INSERT,

    caso eu tente fazer um UPDATE, na primeira vez que eu tento atualizar um campo ele passa sem chamar a trigger, se eu fizer um nova tentativa a trigger começa a bloquear tanto nomes com menos de 5 caracteres e também com mais de 5

    Segue a trigger

    CREATE TRIGGER TG_QUANTIDADE_CARACTRES_INSERT_UPDATE ON
    Pessoa
    AFTER INSERT,UPDATE AS
    
    BEGIN
    	
    	DECLARE @Nome VARCHAR(100)
    
    	SELECT @Nome = Nome FROM inserted
    	SELECT @Nome = Nome FROM deleted	
    
    	IF(LEN(@Nome)<5)
    		
    		BEGIN
    
    		ROLLBACK
    		RAISERROR('QUANTIDADE DE CARACTERES NÃO É SUFICIENTE. MINÍMO 5',16,10)
    		END
    END
    Desde ja agradeço


    domingo, 15 de outubro de 2017 00:59

Respostas

  • O pessoal já respondeu como fazer a trigger funcionar, mas gostaria de te dar uma sugestão, você conhece constraints do tipo Check? Elas são muito mais simples do que triggers, possuem mais performance e muito mais fácil de se dar manutenção. Olha um exemplo de como a mesma regra implementada pela sua trigger ficaria:

    ALTER TABLE Pessoa ADD CONSTRAINT CK_Tamanho_Nome CHECK (LEN(NOME) >= 5) 


    Ariel Goncalves Fernandez

    domingo, 15 de outubro de 2017 22:42
  • Olá.

    Retire a linha:

    SELECT @Nome = Nome FROM deleted

    Abs


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 01:10
  • Pela ordem que seus select's foram colocados na trigger, se vc tiver um registro armazenado com 'vinicius' (8 caracteres) e tentar atualizar para 'joao' (4 caracteres) ele vai deixar pois o deleted busca os valores que estão sendo "apagadas", ou seja, os valores antigos.

    Como vc valida sempre os dados na entrada, seja no insert ou update, vc nao precisa tratar nada referente a tabela deleted.

    Completando, o que aconteceu com vc foi provalvemente, vc fez um update e o registro ficou com menos de 5 caracteres (vc pode validar com um select) e quando tenta fazer o update nele de novo o retorno da query da tabela deleted busca sempre o nome < 5.


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)


    domingo, 15 de outubro de 2017 02:04
  • Deleted
    domingo, 15 de outubro de 2017 20:36

Todas as Respostas

  • Olá.

    Retire a linha:

    SELECT @Nome = Nome FROM deleted

    Abs


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    domingo, 15 de outubro de 2017 01:10
  • Mais porque o update não é a interseção entre o Inserted e Deleted? estou aprendendo triggers agora
    domingo, 15 de outubro de 2017 01:48
  • Pela ordem que seus select's foram colocados na trigger, se vc tiver um registro armazenado com 'vinicius' (8 caracteres) e tentar atualizar para 'joao' (4 caracteres) ele vai deixar pois o deleted busca os valores que estão sendo "apagadas", ou seja, os valores antigos.

    Como vc valida sempre os dados na entrada, seja no insert ou update, vc nao precisa tratar nada referente a tabela deleted.

    Completando, o que aconteceu com vc foi provalvemente, vc fez um update e o registro ficou com menos de 5 caracteres (vc pode validar com um select) e quando tenta fazer o update nele de novo o retorno da query da tabela deleted busca sempre o nome < 5.


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)


    domingo, 15 de outubro de 2017 02:04
  • Vlw obrigado
    domingo, 15 de outubro de 2017 02:44
  • Deleted
    domingo, 15 de outubro de 2017 20:36
  • O pessoal já respondeu como fazer a trigger funcionar, mas gostaria de te dar uma sugestão, você conhece constraints do tipo Check? Elas são muito mais simples do que triggers, possuem mais performance e muito mais fácil de se dar manutenção. Olha um exemplo de como a mesma regra implementada pela sua trigger ficaria:

    ALTER TABLE Pessoa ADD CONSTRAINT CK_Tamanho_Nome CHECK (LEN(NOME) >= 5) 


    Ariel Goncalves Fernandez

    domingo, 15 de outubro de 2017 22:42
  • Esse tipo de validação não e Domínio do banco de dados,

    Wesley Neves - Brasilia-DF

     
    https://wesleyneves.wordpress.com/
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves


    • Editado Wesley Neves segunda-feira, 16 de outubro de 2017 10:31 correção
    segunda-feira, 16 de outubro de 2017 10:12