Recentemente, atualizei do SQL Server 2005 para 2012. No entanto, durante a validação, um bug foi descoberto.
Um determinado gatilho foi codificado da seguinte forma:
CREATE TRIGGER [dbo].[trigger] on [dbo].[foo]
FOR UPDATE, UPDATE
AS
UPDATE foobar
SET datetime = GetDate()
FROM bar
WHERE foobar.id = bar.id
GO
Posso executar isso com segurança (estranhamente) no SQL Server 2005.
No entanto, no SQL Server 2012, ele lança (o que eu esperaria) um erro de sintaxe.
Erro de sintaxe: Especificação duplicada da ação "UPDATE" na declaração do gatilho.
Por que isso não gera um erro de sintaxe no SQL Server 2005? Meu google-fu sobre isso falhou comigo.
Por que isso aparentemente funciona no SQL Server 2005?
John está certo ao dizer que a mensagem de erro de sintaxe atualizada que você recebe:
Isso ocorre absolutamente porque o gatilho é especificado como
FOR UPDATE, UPDATE
. Essa sintaxe era permitida em níveis de compatibilidade mais antigos, mas não nos modernos.Na verdade, eu testei isso e a sintaxe foi permitida no modo de compatibilidade 80 (SQL Server 2000), mas não em 90+. Atualizei minha resposta canônica sobre o nível de compatibilidade 80 .
(Quanto ao motivo de não ser uma alteração significativa documentada, bem, dê de ombros . Você precisará abordar a Microsoft diretamente se quiser uma resposta significativa para essa.)
Quanto ao gatilho em si, eis como eu escreveria isso:
O erro de sintaxe pode ser uma análise mais rigorosa da palavra
table
, não tenho certeza. Se esse é realmente o nome da sua tabela, você deve alterá-lo ou[put it in square brackets]
.A sintaxe real do comando mostra que não existe
FOR UPDATE, UPDATE
- ou melhor, que simplesmente não faz sentido:Portanto, remova esse segundo
UPDATE
(ou altere-o para um,INSERT
se essa for a funcionalidade desejada) e ele não deve gerar um erro. Além disso, a sugestão de Aaron para o conteúdo real do gatilho também é uma boa modificação.Não sei os detalhes de por que funciona em 2005, mas parece que os requisitos para a
CREATE TRIGGER
eram um pouco mais flexíveis naquela época quando se tratava de verificação de sintaxe. Se não for uma quebra documentada , o que não é, então é difícil dizer, a menos que você pergunte ao MS.Independentemente disso, ele funciona corretamente na minha instância de teste de 2005:
Resultados em
Greg
e2
como resultado. Provavelmente é uma adição inofensiva (em 2005) ao gatilho, pois não altera o valor final e não está executando a atualização duas vezes.