Usuário com melhor resposta
Erro de Trigger com update, só funciona com insert

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
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
- Marcado como Resposta Luciano Magalhães segunda-feira, 16 de outubro de 2017 10:52
-
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. :)
- Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:44
-
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. :)
- Editado Vinicius_Fonseca domingo, 15 de outubro de 2017 02:07
- Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:43
-
Deleted
- Marcado como Resposta Luciano Magalhães segunda-feira, 16 de outubro de 2017 10:52
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. :)
- Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:44
-
Mais porque o update não é a interseção entre o Inserted e Deleted? estou aprendendo triggers agora
- Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:43
- Não Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:44
-
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. :)
- Editado Vinicius_Fonseca domingo, 15 de outubro de 2017 02:07
- Marcado como Resposta Luciano Magalhães domingo, 15 de outubro de 2017 02:43
-
-
Deleted
- Marcado como Resposta Luciano Magalhães segunda-feira, 16 de outubro de 2017 10:52
-
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
- Marcado como Resposta Luciano Magalhães segunda-feira, 16 de outubro de 2017 10:52
-
- Editado Wesley Neves segunda-feira, 16 de outubro de 2017 10:31 correção