 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
carlos_tedex Novato


Registrado: Quinta-Feira, 8 de Junho de 2006 Mensagens: 90 Localização: Vila Velha/ES
|
Enviada: Qua Jan 18, 2012 7:17 pm Assunto: Trigger SQL SERVER 2005 dando ERRO |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Qua Jan 18, 2012 9:40 pm Assunto: Re: Trigger SQL SERVER 2005 dando ERRO |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Jan 18, 2012 11:00 pm Assunto: |
|
|
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 |
|
 |
carlos_tedex Novato


Registrado: Quinta-Feira, 8 de Junho de 2006 Mensagens: 90 Localização: Vila Velha/ES
|
Enviada: Qui Jan 19, 2012 7:40 am Assunto: |
|
|
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 |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Qui Jan 19, 2012 12:17 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
|
Voltar ao Topo |
|
 |
leogazio Colaborador


Registrado: Domingo, 18 de Fevereiro de 2007 Mensagens: 1047 Localização: Alto Paraná - PR
|
Enviada: Qui Jan 19, 2012 4:19 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|