ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Trigger SQL SERVER 2005 dando ERRO

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
carlos_tedex
Novato
Novato


Registrado: Quinta-Feira, 8 de Junho de 2006
Mensagens: 90
Localização: Vila Velha/ES

MensagemEnviada: Qua Jan 18, 2012 7:17 pm    Assunto: Trigger SQL SERVER 2005 dando ERRO Responder com Citação

Assunto: Trigger SQL SERVER 2005 dando ERRO

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.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Qua Jan 18, 2012 9:40 pm    Assunto: Re: Trigger SQL SERVER 2005 dando ERRO Responder com Citação

carlos_tedex escreveu:
Assunto: Trigger SQL SERVER 2005 dando ERRO

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.


Cara pelo menos no Oracle não, você na verdade não deve criar esse loop, vamos supor que você tenha 10 registros em uma tabela, isso eu tô dizendo no Oracle, aí você tem a OLDTABELA, no trigger vai ser dado o insert assim como você tá dando aí, sem loop. Quando você dá a instrução; DELETE FROM TABELA sem condição, vai deletar todos os registros da tabela claro, mas todos são deletados um a um, ou seja, se você tem 10 registros, a trigger vai ser executada 10 vezes. Isso eu digo no Oracle, no SQL Server não vou te dar certeza não mas eu acho que isso é padrão cara, acho que trigger funciona da mesma maneira em todos os SGBDs...
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Jan 18, 2012 11:00 pm    Assunto: Responder com Citação

Não tenho experiência com triggers, principalmente com SQL Server, mas fiz uma pesquisa e pelo que entendi a trigger do SQL Server é executada apenas uma vez para cada instrução SQL executada, então se for executada uma instrução do tipo 'DELETE FROM TABELA' a trigger será executada apenas uma vez, e a tabela temporária DELETED vai conter todos os registros excluidos.
Acho que uma alternativa para a questão seria utilizar o seguinte código na trigger:

Código:
Create Trigger Trigger_MESTRE On MESTRE
After Delete
As
begin
  insert into OLDTABELA
    (OLD_TABELA, OLD_USERSQL, OLD_DATASQL, OLD_EVENTO, OLD_CODIGO, OLD_DATAMOV) 
    (select 'MESTRE', suser_name(), getdate(), 'D', CODIGO, DATA from deleted);
end


Espero que seja útil.

_________________
Assinatura: Imoveis a venda em Suzano
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
carlos_tedex
Novato
Novato


Registrado: Quinta-Feira, 8 de Junho de 2006
Mensagens: 90
Localização: Vila Velha/ES

MensagemEnviada: Qui Jan 19, 2012 7:40 am    Assunto: Responder com Citação

imex escreveu:

Código:
Create Trigger Trigger_MESTRE On MESTRE
After Delete
As
begin
  insert into OLDTABELA
    (OLD_TABELA, OLD_USERSQL, OLD_DATASQL, OLD_EVENTO, OLD_CODIGO, OLD_DATAMOV) 
    (select 'MESTRE', suser_name(), getdate(), 'D', CODIGO, DATA from deleted);
end




Caro imex agora tá funcionando certinho muito obrigado. Agradeço tambem ao leogazio por opinar referente ao funcionamento das triggers no Oracle.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Qui Jan 19, 2012 12:17 pm    Assunto: Responder com Citação

carlos_tedex escreveu:
imex escreveu:

Código:
Create Trigger Trigger_MESTRE On MESTRE
After Delete
As
begin
  insert into OLDTABELA
    (OLD_TABELA, OLD_USERSQL, OLD_DATASQL, OLD_EVENTO, OLD_CODIGO, OLD_DATAMOV) 
    (select 'MESTRE', suser_name(), getdate(), 'D', CODIGO, DATA from deleted);
end




Caro imex agora tá funcionando certinho muito obrigado. Agradeço tambem ao leogazio por opinar referente ao funcionamento das triggers no Oracle.


É eu tenho aqui situações parecidas com a sua só que no Oracle, e a trigger é executada X vezes de acordo com a quantidade de registros deletados...
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jan 19, 2012 2:21 pm    Assunto: Responder com Citação

Não postei anteriormente, mas segue a página sobre a trigger do SQL Server que serviu de base para o meu post anterior:
http://msdn.microsoft.com/en-us/library/ms190752.aspx
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leogazio
Colaborador
Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007
Mensagens: 1047
Localização: Alto Paraná - PR

MensagemEnviada: Qui Jan 19, 2012 4:19 pm    Assunto: Responder com Citação

imex escreveu:
Não postei anteriormente, mas segue a página sobre a trigger do SQL Server que serviu de base para o meu post anterior:
http://msdn.microsoft.com/en-us/library/ms190752.aspx


Maneiro Imex, uma coisa que eu sinto falta aqui cara é de mais conteúdos sobre SQL Server, Oracle e o PostgreSQL, o Postgre então aqui não tem quase nada sobre, bom pra diversificar um pouco o fórum pois aqui só dá MySQL e Firebird né... Aqui podia inclusive ter uma área pra publicação de artigos, seria uma boa também...

[]'s.
_________________
Leonardo Gazio - Consultoria e Suporte a Desenvolvedores.

Suporte para todo o Brasil via;
E-mail: leonardogazio@delphimasters.com
Msn: lngsmattos@hotmail.com
Claro: (21) 7301-7243
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB