Array
(
)

Trigger SQL SERVER 2005 dando ERRO

Carlos Eduardo
   - 18 jan 2012

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:
#Código

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:
#Código
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.

Bretas
   - 19 jan 2012

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:

#Código

set @codigo = (select CODIGO from Deleted)


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

Então tente fazer assim:

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

Carlos Eduardo
   - 19 jan 2012

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.