Trigger SQL SERVER 2005 dando ERRO

18/01/2012

0

Sou novo na criação de triggers e gostaria de alguma ajuda. Minha duvida é a seguinte criei uma trigger para ao deletar um registro da tabela MESTRE os dados sejam armazenados em outra tabela (OLDTABELA). Quando executo o comando para apagar um unico registro delete MESTRE where CODIGO = 1 a outra tabela é alimentada automaticamente sem problemas mas ao deletar toda tabela delete MESTRE ocorre esse erro:

Msg 512, Level 16, State 1, Procedure Trigger_MESTRE, Line 5
A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão.
A instrução foi finalizada.


Pelo que pude analizar o problema é justamente quando existe mais de um registro deletado causando o erro acima. Gostaria de saber se o correto seria dar um loop dentro da Trigger para que seja executado o comando insert um a um. Como fazer isso?

Outra duvida tambem é se sempre que preciso pegar um campo da tabela deletada dentro de uma trigger sempre tenho que fazer isso set @data = (select DATA from Deleted) ou tem uma maneira mais pratica?

codigo da trigger:
Create Trigger Trigger_MESTRE On MESTRE
For Delete
As
  declare @codigo int, @data datetime
  set @codigo = (select CODIGO from Deleted)
  set @data = (select DATA from Deleted)
  insert into OLDTABELA
    (OLD_TABELA, OLD_USERSQL, OLD_DATASQL, OLD_EVENTO, OLD_CODIGO, OLD_DATAMOV)
  values
    (MESTRE, suser_name(), getdate(), D, @codigo, @data)


Grato.
Carlos Eduardo

Carlos Eduardo

Responder

Posts

19/01/2012

Gustavo Bretas

E ae Carlos, tudo certo?

Não é nescessário fazer um looping dentro da trigger, mas vamos tentar modificar a forma que vc esta inserindo os registros na tabela!

Esse erro ocorre por conta desta linha:

set @codigo = (select CODIGO from Deleted)


Variável não comporta mais de um valor, como diz na mensagem.

Então tente fazer assim:

Create Trigger Trigger_MESTRE On MESTRE
For Delete
As
insert into OLDTABELA select MESTRE, suser_name(), getdate(), D, CODIGO, DATA from Deleted

Responder

19/01/2012

Carlos Eduardo

Ola Bretas blz, seguinte postei essa mesma duvida em outro forum, e me deram uma solução parecido com a sua. Vou postar o link aqui para que outros possam verificar tambem.

http://www.activedelphi.com.br/forum/viewtopic.php?t=70536&sid=437b1cfa6745f62e6c06a1a6cdd88519

Obrigado pela sugestão.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar