Eu criei um gatilho que, se o comprimento de [name] <= 2
executar uma instrução de atualização. Essa trigger dispara 98% das vezes, o que me leva a acreditar que 2% das vezes ela não dispara significa que o registro Updated()
não foiInserted()
Este é o DDL de amostra e meu gatilho. Há algum problema com a sintaxe do meu gatilho? Ou devo procurar uma maneira de determinar se o registro foi atualizado?
Create Table TwoNumericNames
(
name varchar(500)
)
Insert Into TwoNumericNames (name) Values
('AA'), ('RR'), ('CC'), ('MM'), ('EE')
CREATE TRIGGER trgUpdateName
ON [TwoNumericNames]
FOR INSERT
AS
Begin
UPDATE [TwoNumericNames]
SET [name] = CASE
WHEN [name] LIKE '%AA%' THEN 'Alpha Awe'
WHEN [name] LIKE '%RR%' THEN 'Raw Red'
WHEN [name] LIKE '%CC%' THEN 'Capt Cree'
WHEN [name] LIKE '%MM%' THEN 'My More'
WHEN [name] LIKE '%EE%' THEN 'Ed Ewe'
END
WHERE LEN([name]) <= 2
END
EDIT
Talvez um AfterInsert()
gatilho funcione melhor. É assim que deve ser configurado?
Create Table TwoNumericNames
(
id int,
name varchar(500)
)
Insert Into TwoNumericNames (name) Values
(1,'AA'), (2,'RR'), (3,'CC'), (4,'MM'), (5,'EE')
CREATE TRIGGER [dbo].[trgUpdateName] ON [dbo].[TwoNumericNames]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- get the last id value of the record inserted or updated
DECLARE @id INT
SELECT @id = [Name]
FROM INSERTED
-- Insert statements for trigger here
UPDATE [dbo].[TwoNumericNames]
SET [name] = CASE
WHEN [name] LIKE '%AA%' THEN 'Alpha Awe'
WHEN [name] LIKE '%RR%' THEN 'Raw Red'
WHEN [name] LIKE '%CC%' THEN 'Capt Cree'
WHEN [name] LIKE '%MM%' THEN 'My More'
WHEN [name] LIKE '%EE%' THEN 'Ed Ewe'
END
WHERE [id] = @id
END
Como muitos comentaram, você deseja isolar seu gatilho para disparar e modificar apenas quando necessário. Isso significa que você terá que filtrar apenas o registro que foi inserido. Você pode fazer isso com a
inserted
exibição. Como você verá no código de exemplo abaixo, modifiquei ligeiramente seu código para ver mais facilmente o que está acontecendo e isolar a instrução de atualização para afetar apenas a linha inserida.