DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
Carlos Eduardo
 

País: Brasil
Estado: ES
Cidade: vila velha
Mensagens: 9
 Postado em: 18/1/2012 8:19:39 PM

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
 
 


País: Brasil
Estado: MT
Cidade: Cuiabá
Mensagens: 189
 Postado em: 19/1/2012 9:46:41 AM
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
 

País: Brasil
Estado: ES
Cidade: vila velha
Mensagens: 9
 Postado em: 19/1/2012 10:34:26 AM
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.

 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03